.NET平台开源项目速览(3)小巧轻量级NoSQL文件数据库LiteDB

简介:

    今天给大家介绍一个不错的小巧轻量级的NoSQL文件数据库LiteDB。本博客在2013年也介绍过2款.NET平台的开源数据库:

1.【原创】开源.NET下的XML数据库介绍及入门 

2.【原创】C#开源轻量级对象数据库NDatabase介绍 

    上面2个数据库我的实际的项目中用过,还不错。当然数据量很小,主要是客户比较变态,必须要用xml文件保存,就想到了,另外NDatabase只是自己觉得好玩,也用了一下。

提示:没有x86,x64之分,可以AnyCPU使用。4.5版本也可以使用,如果需要专门的4.5版本,可以自己编译,另外Mono的问题,官方没有提到,应该是暂时不支持,自己也没有环境,不好测试,希望有环境的朋友,可以用简单代码测试一下。

.NET开源目录:【目录】本博客其他.NET开源项目文章目录

 本文原文地址:.NET平台开源项目速览(3)小巧轻量级NoSQL文件数据库LiteDB

1.LiteDB初步介绍

1.1 基本功能预览

  LiteDB是一个小型的.NET平台开源的NoSQL类型的轻量级文件数据库。特点是小和快,dll文件只有200K大小,而且支持LINQ和命令行操作,数据库是一个单一文件,类似Sqlite。

  官方网站:http://www.litedb.org/

    主要特点有(翻译官方介绍,如有不准确,请指正):

1.NoSQL文件存储。这是和传统关系型数据库的主要区别;支持实体类的字段更新;
2.类似MongoDB的简单API;
3.完全使用C#代码,在.NET 4.0环境下编写,核心dll小巧,只有168K;
4.支持ACID事务处理;
5.可以进行写入失败的恢复;
6.存储到文件或者数据流中(类似MongoDB的GridFS);
7.类似Sqlite的单一文件存储;
8.支持文件索引,可以进行快速搜索;可以直接存储文件;

9.支持Linq查询;【这也许是C#编写最直接的好处】;
10.支持命令行操作数据库,官方提供了一个Shell command line;
11.完全开源和免费,包括商业使用;

1.2 使用场景

  虽然小巧,但也不是万能的,LiteDB给出了几个可能或者比较适合使用的场景。大家可以根据实际情况进行或者根据需要进行测试,看是不是自己需要的: 

1.桌面或者本地小型的应用程序
2.小型web应用程序
3.单个数据库账户或者单个用户数据的存储
4.少量用户的并发写操作的应用程序

2.LiteDB使用基本案例

    上面只是基本介绍,先从搞一个简单的案例介绍如何使用。大家可以感觉一下。如果要具体使用,就好好研究下官方的文件。本文下面几节也将大概介绍一下LiteDB的相关原理和技术细节。有空我会做一个大数据下的测试,看看如何。这里只是为了介绍给大家研究而已。

2.1 创建实体类

    为了例子需要,我们创建一个简单的实体类,如下面所示,只包括几个基本的属性信息。

1
2
3
4
5
6
7
public  class  Customer
{
     public  int  Id {  get set ; }
     public  string  Name {  get set ; }
     public  string [] Phones {  get set ; }
     public  bool  IsActive {  get set ; }
}

2.2 使用Demo

    使用过程首先要添加dll应用,以及引入命名空间:

1
using  LiteDB;

    下面是测试代码,会在当前目录下创建一个sample.db的数据库文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//打开或者创建新的数据库
using  ( var  db =  new  LiteDatabase( "sample.db" ))
{
     //获取 customers 集合,如果没有会创建,相当于表
     var  col = db.GetCollection<Customer>( "customers" );
     //创建 customers 实例
     var  customer =  new  Customer
     {
         Name =  "John Doe" ,
         Phones =  new  string [] {  "8000-0000" "9000-0000"  },
         IsActive =  true
     };
     // 将新的对象插入到数据表中,Id是自增,自动生成的
     col.Insert(customer);
     // 更新实例
     customer.Name =  "Joana Doe" ;
     //保存到数据库
     col.Update(customer);
     // 使用对象的属性,这个方法生成索引,来进行检索
     col.EnsureIndex(x => x.Name);
     //使用LINQ语法来检索
     var  results = col.Find(x => x.Name.StartsWith( "Jo" ));
}

    上述过程很清楚,根据注释理解几乎不用费神。

3.LiteDB的技术细节

  例子的使用简单,但其实还不够全面,本节就稍微翻译一下LiteDB官方提供的一些技术资料和文档。让你对LiteDB更加了解和易于使用。

3.1.LiteDB的工作原理

  本节翻译自:https://github.com/mbdavid/LiteDB/wiki/How-LiteDB-Works

  LiteDB是虽然单个文件类型的数据库,但是数据库有很多信息,例如索引,集合,文件等。为了管理这些信息,LiteDB实现了数据库页的概念。页 是一个拥有4096 字节的 存储相同信息的地址块。页 也是操作磁盘文件(读写)的最小单元。LiteDB有6种页类型。其作用也不一样,分布是:Header Page,Collection Page,Index Page, Data Page,Extend Page,Empty Page。鉴于篇幅较大,这里只介绍重要的Data Page。其他几个页面的作用看文件也很容易。Data Page的作用是存储核心的数据,是以序列化后的BSON格式来存储。值得注意的是,如果存储的数据太大,超过page大小,数据块就会使用一个指针指向Extend Page。

  在上面的代码中,我们初始化数据库是这样的:

1
var  db = new  LiteDatabase( "MyData.db" );

  这种情况比较好用,可以打开或者创建新的数据库,同样也可以使用连接名称来获取,例如:

1
var  db = new  LiteDatabase( "userdb" );

  这样会直接从connectionStrings找到这个名称的连接。包括了文件名称,使用模式,以及版本信息。一般情况下直接使用第一种即可。

  LiteDB的数据库连接完整形式是:filename=C:\Path\mydb.db; journal=false; version=5  

3.2 LiteDB的查询

  本节翻译自:https://github.com/mbdavid/LiteDB/wiki/Queries

  LiteDB的查询必须在相关的查询字段上使用索引,如果没有索引,会默认去创建索引。上面例子中就是创建字段的索引,并查询。LiteDB中查询有2种方法:

1.使用静态的帮助类Query;

2.使用Linq方式,就是类似Demo的方法;

  LiteDB使用Query的查询方式有以下一些方法,详细讲解几个重要的,其他几个大家理解一下,也应该不难,如果有不准确的地方,还请指正: 

Query.All 返回所有的数据,可以使用指定的索引字段进行排序
Query.EQ 查找返回和指定字段值相等的数据
Query.LT/LTE 查找< 或 <= 某个值的数据
Query.GT/GTE 查找> 或 >= 某个值的数据
Query.Between 查找在指定区间范围内的数据
Query.In - 和SQL的in类似吧,查找和列表中值相等的数据
Query.Not - 和EQ相反,是不等于某个值的数据
Query.StartsWith 查找以某个字符串开头的数据
Query.Contains 查找保护某个字符串的数据,这个查询只扫描索引
Query.And 2个查询的交集
Query.Or 2个查询结果的并集

  看看实际代码:

1
2
3
4
5
6
var  results = collection.Find(Query.EQ( "Name" , "John Doe" ));
var  results = collection.Find(Query.GTE( "Age" , 25));
var  results = collection.Find(Query.And(
     Query.EQ( "FirstName" , "John" ), Query.EQ( "LastName" , "Doe" )
));
var  results = collection.Find(Query.StartsWith( "Name" , "Jo" ));

  如图,语法是左边是字段,右边是值。注意LiteDB不支持这种表达式:CreationDate == DueDate。

  下面介绍使用Linq的查询的几个主要方法:

FindAll: 查找表或者集合中所有的结果记录

FindOne:返回第一个或者默认的结果
FindById: 通过索引返回单个结果
Find: 使用查询表达式或者linq表达式查询返回结果

   看看几个例子:

1
2
3
4
5
6
7
8
9
10
collection.EnsureIndex(x => x.Name);
var  result = collection
     .Find(Query.EQ( "Name" , "John Doe" ))
     .Where(x => x.CreationDate >= x.DueDate.AddDays(-5))
     .OrderBy(x => x.Age)
     .Select(x => new
     {
         FullName = x.FirstName + " "  + x.LastName,
         DueDays = x.DueDate - x.CreationDate
     });

   当然还有一些方法如:Count() , Exists(),Min() , Max()等方法。。比较好理解。看看linq表达式的查询案例:

1
2
3
4
var  collection = db.GetCollection<Customer>( "customer" );
var  results = collection.Find(x => x.Name == "John Doe" );
var  results = collection.Find(x => x.Age > 30);
var  results = collection.Find(x => x.Name.StartsWith( "John" ) && x.Age > 30);

4.资源其他

  LiteDB的介绍就基本完成了,实际还有很多技术细节在官方文档中。比较简单也好理解,不再翻译。这里提供一个2015年5月25日下载的源码版本和例子源代码。

  源代码和Demo下载 1.0.2:LiteDB-1.02.rar

  同样,官方没有提供离线版的CHM文档,我手动制作了一份,提供下载,如下图:

特别提醒:帮助文件CHM打开显示不了请右键,属性,解除锁定。。。路径,文件名都不能含有特殊字符,否则也不能打开。。常见问题,有网友问起,提醒一下。

  

  帮助文档下载地址:CSharp数据库LiteDB帮助文档.rar 


本文转自叶小钗 h数据之巅博客园博客,原文链接:http://www.cnblogs.com/asxinyu/p/dotnet_Opensource_project_LiteDB.html,如需转载请自行联系原作者


如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。


相关文章
|
1月前
|
C#
一个.NET开源、轻量级的运行耗时统计库 - MethodTimer
一个.NET开源、轻量级的运行耗时统计库 - MethodTimer
|
27天前
|
机器学习/深度学习 人工智能 Cloud Native
在数字化时代,.NET 技术凭借其跨平台兼容性、丰富的类库和工具集以及卓越的性能与效率,成为软件开发的重要平台
在数字化时代,.NET 技术凭借其跨平台兼容性、丰富的类库和工具集以及卓越的性能与效率,成为软件开发的重要平台。本文深入解析 .NET 的核心优势,探讨其在企业级应用、Web 开发及移动应用等领域的应用案例,并展望未来在人工智能、云原生等方面的发展趋势。
32 3
|
1月前
|
存储 设计模式 编解码
.NET 8.0 通用管理平台,支持模块化、WinForms 和 WPF
【11月更文挑战第5天】本文分析了.NET 8.0 通用管理平台在模块化、WinForms 和 WPF 方面的优势。模块化设计提升了系统的可维护性和可扩展性,提高了代码复用性;WinForms 提供了丰富的控件库和简单易用的开发模式,技术成熟稳定;WPF 支持强大的数据绑定和 MVVM 模式,具备丰富的图形和动画功能,以及灵活的布局系统。
|
2月前
|
数据采集 传感器 监控
.NET 工控网关 轻量级组态软件
【10月更文挑战第10天】.NET 工控网关是一种基于 .NET 平台开发的设备,用于连接工业控制系统中的不同网络和设备,实现数据传输和协议转换。它能统一处理多种协议(如 Modbus、Profibus)的数据,便于后续系统处理。.NET 平台的优势包括开发效率高、跨平台能力强及安全性高,适用于工业物联网环境。此外,轻量级组态软件具备体积小、资源占用少的特点,可在资源受限的设备上运行,提供数据采集、监控、报警及数据分析等功能,简化工业自动化过程。
|
2月前
|
开发框架 JavaScript 前端开发
一个适用于 ASP.NET Core 的轻量级插件框架
一个适用于 ASP.NET Core 的轻量级插件框架
|
2月前
|
存储 NoSQL API
.NET NoSQL 嵌入式数据库 LiteDB 使用教程
.NET NoSQL 嵌入式数据库 LiteDB 使用教程~
|
3月前
|
API C# Windows
一个.NET开源、现代、轻量级的文本编辑器
一个.NET开源、现代、轻量级的文本编辑器
|
4月前
|
开发者 API Windows
从怀旧到革新:看WinForms如何在保持向后兼容性的前提下,借助.NET新平台的力量实现自我进化与应用现代化,让经典桌面应用焕发第二春——我们的WinForms应用转型之路深度剖析
【8月更文挑战第31天】在Windows桌面应用开发中,Windows Forms(WinForms)依然是许多开发者的首选。尽管.NET Framework已演进至.NET 5 及更高版本,WinForms 仍作为核心组件保留,支持现有代码库的同时引入新特性。开发者可将项目迁移至.NET Core,享受性能提升和跨平台能力。迁移时需注意API变更,确保应用平稳过渡。通过自定义样式或第三方控件库,还可增强视觉效果。结合.NET新功能,WinForms 应用不仅能延续既有投资,还能焕发新生。 示例代码展示了如何在.NET Core中创建包含按钮和标签的基本窗口,实现简单的用户交互。
77 0
|
3月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
46 7
|
3月前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
74 0