.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文件存储。这是和传统关系型数据库的主要区别;支持实体类的字段更新; 9.支持Linq查询;【这也许是C#编写最直接的好处】; 1.2 使用场景虽然小巧,但也不是万能的,LiteDB给出了几个可能或者比较适合使用的场景。大家可以根据实际情况进行或者根据需要进行测试,看是不是自己需要的: 1.桌面或者本地小型的应用程序 2.LiteDB使用基本案例上面只是基本介绍,先从搞一个简单的案例介绍如何使用。大家可以感觉一下。如果要具体使用,就好好研究下官方的文件。本文下面几节也将大概介绍一下LiteDB的相关原理和技术细节。有空我会做一个大数据下的测试,看看如何。这里只是为了介绍给大家研究而已。 2.1 创建实体类为了例子需要,我们创建一个简单的实体类,如下面所示,只包括几个基本的属性信息。 publicclassCustomer { publicintId{get;set;} publicstringName{get;set;} publicstring[]Phones{get;set;} publicboolIsActive{get;set;} } 2.2 使用Demo使用过程首先要添加dll应用,以及引入命名空间: usingLiteDB; 下面是测试代码,会在当前目录下创建一个sample.db的数据库文件: //打开或者创建新的数据库 using(vardb=newLiteDatabase("sample.db")) { //获取customers集合,如果没有会创建,相当于表 varcol=db.GetCollection<Customer>("customers"); //创建customers实例 varcustomer=newCustomer { Name="JohnDoe",Phones=newstring[]{"8000-0000","9000-0000"},IsActive=true }; //将新的对象插入到数据表中,Id是自增,自动生成的 col.Insert(customer); //更新实例 customer.Name="JoanaDoe"; //保存到数据库 col.Update(customer); //使用对象的属性,这个方法生成索引,来进行检索 col.EnsureIndex(x=>x.Name); //使用LINQ语法来检索 varresults=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。 在上面的代码中,我们初始化数据库是这样的: var db = new LiteDatabase("MyData.db"); 这种情况比较好用,可以打开或者创建新的数据库,同样也可以使用连接名称来获取,例如: var db = new LiteDatabase("userdb"); 这样会直接从connectionStrings找到这个名称的连接。包括了文件名称,使用模式,以及版本信息。一般情况下直接使用第一种即可。 LiteDB的数据库连接完整形式是:filename=C:Pathmydb.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 返回所有的数据,可以使用指定的索引字段进行排序 看看实际代码: 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的查询的几个主要方法:
看看几个例子: 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表达式的查询案例: 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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |