LitDB文章

阅读目录

今天给大家介绍一个不错的小巧轻量级的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 创建实体类

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

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应用,以及引入命名空间:

using LiteDB;

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

//打开或者创建新的数据库
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。

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

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

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

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个查询结果的并集

  看看实际代码:

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表达式查询返回结果

  看看几个例子:

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


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

LitDB文章的相关文章

JVM学习(2)——技术文章里常说的堆,栈,堆栈到底是什么,从os的角度总结--转载http://www.cnblogs.com/kubixuesheng/p/5202561.html

转载自---http://www.cnblogs.com/kubixuesheng/p/5202561.html 俗话说,自己写的代码,6个月后也是别人的代码--复习!复习!复习!涉及到的知识点总结如下: 堆栈是栈 JVM栈和本地方法栈划分 Java中的堆,栈和c/c++中的堆,栈 数据结构层面的堆,栈 os层面的堆,栈 JVM的堆,栈和os如何对应 为啥方法的调用需要栈 属于月经问题了,正好碰上有人问我这类比较基础的知识,无奈我自觉回答不是有效果,现在深入浅出的总结下: 前一篇文章总结了:JV

《深入理解Java集合框架》系列文章

Introduction 关于C++标准模板库(Standard Template Library, STL)的书籍和资料有很多,关于Java集合框架(Java Collections Framework, JCF)的资料却很少,甚至很难找到一本专门介绍它的书籍,这给Java学习者们带来不小的麻烦.我深深的不解其中的原因.虽然JCF设计参考了STL,但其定位不是Java版的STL,而是要实现一个精简紧凑的容器框架,对STL的介绍自然不能替代对JCF的介绍. 本系列文章主要从数据结构和算法层面分析

对TTY的理解,这篇文章不错

原文:http://blog.chinaunix.net/uid-20543672-id-3225777.html 虽然一直做嵌入式Linux,宿主机和开发板通信天天都在用tty设备通信,但是其实自己对TTY设备及终端的概念认识几乎是0.对于Linux内核的终端.tty.控制台等概念的认识很模糊.由于在学习的时候碰到了重定向console的问题,所以借机学习下tty的知识.以下是我对tty的认识总结,信息来源于网络和内核文档.参考资料见文章末尾. tty一词源于Teletypes,或Telety

最近在开发一个文章聚合的工具

现在的RSS一个重大的问题就是内容重复,针对性不是特别的强.还有一点是无法推荐好的优质文章. 说实在的时间是个宝贵的东西,宁可花点钱读点有价值的文章,也不看一堆rss结果中找好的文章,还不一定找到,浪费时间啊. 所有我决定做一个小工具.文章聚合并去重,同时还根据友情链接挖掘好的rss源. 项目目前为止,可以提供简单的访问和更新功能,挖掘的功能还没有做.

微服务 - 文章

[微服务与容器的监控 —— 来自Adrian Cockcroft的挑战][http://www.infoq.com/cn/news/2015/07/monitoring-microservices]Adrian Cockcroft在GlueCon 2015大会上为听众列举了如何对微服务与基于容器的应用进行监控的多条规则.他还重强调了在监控cloud native并且基于容器的系统时所面临的挑战,并介绍了微服务模拟与可视化工具“Spigo” [微服务的好处][http://www.infoq.co

无限互联奖学金文章连载北京总部四十九期胡梦川 第一篇

无限互联奖学金文章连载北京总部四十九期胡梦川 第一篇: 今天是来到无限互联的第四天,严格来说已经第六天了,刚来就是开班典礼,给人一种很好的氛围.老师讲了很多关于以后学习的技巧和规定,我的第一感觉是,比备战高考还要严格,不过这才能体现一个组织的负责任.正式开讲才感觉到这个班级的大神无处不在,不努力根本赶不上,就是这个学习氛围和高强度的练习很重要.多用心你才能感觉到有些事其实很简单.关于学习时间大家基本都是一天不动的在敲代码,等于给自己一个机会吧.时间飞逝,抓住机会才重要.刚来第一周,感受最深就是好

《鸡啄米C++编程入门系列》系列技术文章整理收藏

<鸡啄米C++编程入门系列>系列技术文章整理收藏 收藏整理鸡啄米C++编程入门系列文章,供个人和网友学习C++时参考 1鸡啄米:C++编程入门系列之前言 2鸡啄米:C++编程入门系列之一(进制数) 3鸡啄米:C++编程入门系列之二(原码.反码与补码) 4鸡啄米:C++编程入门系列之三(VS2010的使用介绍) 5鸡啄米:C++编程入门系列之四(数据类型) 6鸡啄米:C++编程入门系列之五(运算符和表达式) 7鸡啄米:C++编程入门系列之六(算法的基本控制结构之选择结构) 8鸡啄米:C++编程入

文章标题

epoll极简介绍 关于epoll的详细介绍,已经有较多文章可以参考,例如这篇文章介绍就比较详细: http://blog.chinaunix.net/uid-24517549-id-4051156.html epoll编程的接口: epoll_create 创建一个epoll内核对象,返回指向该对象的fd epoll_ctl 往epoll中添加.删除.修改需要监控的套接字 epoll_wait 等待epoll中的套接字产生可读.可写.异常消息 使用epoll时有如下应该注意的地方: 确保被ep

如何编辑好看的微信文章微助点微信编辑

微助点微信编辑器,是一款"素材最多,最好用"的微信图文编辑工具,丰富素材样式任您挑选,调整颜色.排版更简单,为您提供好看.易读的文章是我们动力!下面给您具体介绍微助点微信编辑器. 1.编辑器网站框架 怎么样?看起来简单大气吧,微助点编辑器操作起来也和他的界面一样简单方便,还有更多的文本.标题.分割线.内容等素材可以供大家选择使用.再来看看其他素材的截图 更多的素材可访问微助点官方网站微助点官方网址