LitDB文章
今天给大家介绍一个不错的小巧轻量级的NoSQL文件数据库LiteDB。本博客在2013年也介绍过2款.NET平台的开源数据库:
上面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。
主要特点有(翻译官方介绍,如有不准确,请指正):
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", ));
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(-))
.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 > );
var results = collection.Find(x => x.Name.StartsWith("John") && x.Age > );
4.资源其他
LiteDB的介绍就基本完成了,实际还有很多技术细节在官方文档中。比较简单也好理解,不再翻译。这里提供一个2015年5月25日下载的源码版本和例子源代码。
源代码和Demo下载 1.0.2:LiteDB-1.02.rar
同样,官方没有提供离线版的CHM文档,我手动制作了一份,提供下载,如下图:
特别提醒:帮助文件CHM打开显示不了请右键,属性,解除锁定。。。路径,文件名都不能含有特殊字符,否则也不能打开。。常见问题,有网友问起,提醒一下。
帮助文档下载地址:CSharp数据库LiteDB帮助文档.rar
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
.NET数据挖掘与机器学习,作者博客:http://www.cnblogs.com/asxinyu
E-mail:1287263703@qq.com
LitDB文章的更多相关文章
- C# 文章导航
1. C#相关文章 1.1 C# 基础(一) 访问修饰符.ref与out.标志枚举等等 1.2 C# 基础(二) 类与接口 1.3 C# DateTime日期格式化 1.4 C# DateTime与时 ...
- 分布式系列文章——Paxos算法原理与推导
Paxos算法在分布式领域具有非常重要的地位.但是Paxos算法有两个比较明显的缺点:1.难以理解 2.工程实现更难. 网上有很多讲解Paxos算法的文章,但是质量参差不齐.看了很多关于Paxos的资 ...
- 基于DDD的现代ASP.NET开发框架--ABP系列文章总目录
ABP相关岗位招聘:给热爱.NET新技术和ABP框架的朋友带来一个高薪的工作机会 ABP交流会录像视频:ABP架构设计交流群-7月18日上海线下交流会的内容分享(有高清录像视频的链接) 代码自动生成: ...
- 有朋友问了数据库ID不连续,怎么获取上一篇和下一篇的文章?(不是所有情况都适用)
呃 (⊙o⊙)…,逆天好久没写SQL了,EF用的时间长了,SQL都不怎么熟悉了......[SQL水平比较菜,大牛勿喷] 方法很多种,说个最常见的处理 因为id是自增长的,所以一般情况下下一篇文章的I ...
- iOS系列文章
本博客全为原创,如果借鉴了其他文章会在博文的下面进行说明.欢迎转载,但要在文章中给出原文链接,谢谢. 有链接的说明已经发布,没有链接的说明还没有发布. 并不是所有的博文都在这里罗列,有兴趣的可以看博客 ...
- 【NLP】蓦然回首:谈谈学习模型的评估系列文章(一)
统计角度窥视模型概念 作者:白宁超 2016年7月18日17:18:43 摘要:写本文的初衷源于基于HMM模型序列标注的一个实验,实验完成之后,迫切想知道采用的序列标注模型的好坏,有哪些指标可以度量. ...
- 【NLP】揭秘马尔可夫模型神秘面纱系列文章(一)
初识马尔可夫和马尔可夫链 作者:白宁超 2016年7月10日20:34:20 摘要:最早接触马尔可夫模型的定义源于吴军先生<数学之美>一书,起初觉得深奥难懂且无什么用场.直到学习自然语言处 ...
- 在知乎上看到 Web Socket这篇文章讲得确实挺好,从头看到尾都非常形象生动,一口气看完,没有半点模糊,非常不错
在知乎上看到这篇文章讲得确实挺好,从头看到尾都非常形象生动,一口气看完,没有半点模糊,非常不错,所以推荐给大家,非常值得一读. 作者:Ovear链接:https://www.zhihu.com/que ...
- 【手把手】JavaWeb 入门级项目实战 -- 文章发布系统 (第十二节)
好的,那么在上一节中呢,评论功能的后台已经写好了,这一节,先把这部分后台代码和前台对接一下. 1.评论功能实现 我们修改一下保存评论按钮的点击事件,用jQuery的方式获取文本框中的值,然后通过aja ...
随机推荐
- java 的复用工具 - jar包
前言 Java提供了jar包的机制,使得已经开发好了的类能够顺利的被将来的工程所复用. 本章主要讲解如何使用这种工具. 包的作用 包能够将不同功用的类组织起来,从而确保类名的唯一性. 为了保证包名的唯 ...
- TCP三次握手连接与四次握手断开
http://blog.csdn.net/whuslei/article/details/6667471(三次握手与四次握手) 1. TCP的三次握手最主要是防止已过期的连接再次传到被连接的主机. 如 ...
- haar-like特征(转载)
浅析人脸检测之Haar分类器方法 [补充] 这是我时隔差不多两年后, 回来编辑这篇文章加的这段补充, 说实话看到这么多评论很是惊讶, 有很多评论不是我不想回复, 真的是时间久了, 很多细节我都忘记了 ...
- 如何优雅的写C++代码(一)
// get the greatest power of two that is a divisor of n: return n&-n; // swap two integers a and ...
- linux权限管理_ACL权限
一.什么是ACL权限 ACL是Access Control List(访问控制列表)的缩写,主要的目的是在提供传统的owner,group,others的read,write,execute权限之外的 ...
- hihoCoder挑战赛23
hihoCoder挑战赛23 A.Emulator 题意 给一张图,有\(N(N \le 300)\)个点, 给出任意两点之间的最短路. 求最多可以去掉多少条边,使得任意两点的最短路长度不变. 思路 ...
- HDU 2095 find your present (2)
HDU 2095 find your present (2) 解法一:使用set 利用set,由于只有一个为奇数次,对一个数进行查询,不在集合中则插入,在集合中则删除,最后剩下的就是结果 /* HDU ...
- Vue.js相关知识4-路由
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- vimium 使用心得
首先,建议记住chrom自己的支持的快捷键 https://support.google.com/chrome/answer/157179?hl=zh-Hans&hlrm=en-GB& ...
- C++ 遇到的问题小结
1. cannot convert 'std::basic_string<char>' to 'int' in assignment ... 原始code如下: int id2; std: ...