0
点赞
收藏
分享

微信扫一扫

LiteDB v.2.0.0-rc 使用介绍


在寻找NoSql数据库时,发现了 LiteDb 这个纯 .net 开发的嵌入型数据库。

用着挺方便,所以推荐下。

对于我的应用场景它还有如下不足:

1.分区存储:litedb 是个单文件数据库,如果能实现随意控制每个分区文件的大小就好了,自己改忒麻烦

2.事务处理:在 v2.0 中没有。 但看正在开发的版本中支持显示事务的功能了,期待中....


一、概要(2016-06)

1.独立的数据库 


LiteDB 完全用c#编写的一个 serverless数据库。只需要一个DLL(小于200 kb)。 


安装通过NuGet或DLL复制到你的本项目文件夹。




2.又快又轻 


LiteDB是一个简单和快速的NoSQL数据库解决方案。


适合: 


桌面/本地地的小型应用程序 


应用程序文件格式 


小型web应用程序 


一个存储 账户/用户 的数据库


并发写操作 




3.更多… 


文档 ACID 事务 


单一的数据文件(像SQLite) 


写失败时恢复数据(journal mode,日志模型) 


映射c#对象到BsonDocument 


提供自定义映射 API


交叉引用集合(DbRef) 


存储文件和流数据(像 MongoDB GridFS 工具) 


LINQ支持 


对所有用户免费,包括商业用途 





二、下载地址


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


源码:https://github.com/mbdavid/LiteDB


文档:https://github.com/mbdavid/LiteDB/wiki




三、查询 API 说明




Query.All - 返回所有


Query.EQ - 等于 (==)


Query.LT/LTE - 小于(<) 或小于等于 (<=)


Query.GT/GTE - 大于(>) 或大于等于 (>=)


Query.Between - 在 start、end 之间


Query.In - 等于 list 值


Query.Not - 不等于(!=)


Query.StartsWith - 查询一个以指定字符开头的字符串,只支持string类型


Query.Contains - 查询一个包含指定字符的文档. 只支持string类型.


Query.And - 两个查询的与操作


Query.Or - 两个查询的或操作




实例:


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"));




四、代码实例


1.基础实例



// Basic example

public class Customer

{

public int Id { get; set; }

public string Name { get; set; }

public string[] Phones { get; set; }

public bool IsActive { get; set; }

}



// 打开数据库 (如果不存在则创建)

using(var db = new LiteDatabase(@"MyData.db"))

{

// 获取名称为 customers 的集合,该集合存储 Customer 对象

var customers = db.GetCollection<Customer>("customers");



// Create your new customer instance

var customer = new Customer

{

Name = "John Doe",

Phones = new string[] { "8000-0000", "9000-0000" },

IsActive = true

};



// 插入

customers.Insert(customer);



//更新

customer.Name = "Joana Doe";

customers.Update(customer);



//使用索引

customers.EnsureIndex(x => x.Name);



//使用 linq 查询

var results = customers.Find(x => x.Name.StartsWith("Jo"));

}


2.存储文件



// Store files

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

{

// Upload a file from file system

db.FileStore.Upload("/my/file-id", @"C:\Temp\picture1.jgn");



// Upload a file from Stream

db.FileStore.Upload("/my/file-id", myStream);



// Open as an stream

var stream = db.FileStore.OpenRead("/my/file-id");



// Write to another stream

stream.CopyTo(Response.Output);



}


3.实体映射 


// Custom entity mapping to BsonDocument

using(var db = new LiteDatabase(@"MyData.db"))

{

db.Mapper.Entity<Customer>()

.Key(x => x.CustomerKey) //指定 CustomerKey 属性

.Map(x => x.Name, "customer_name") //映射到 Bson 的 customer_name 属性上

.Ignore(x => x.Age) //忽略 Age 属性

.Index(x => x.Name, unique); //将 name 标记为唯一索引



var doc = db.Mapper.ToDocument(new Customer { ... }); //转换实体为 bson

var json = JsonSerializer.Serialize(doc, true); //序列化 bson 为 json



/* json:

{

"_id": 1,

"customer_name": "John Doe"

}

*/

}




4.使用流为数据库


//创建一个内存流数据库

var mem = new MemoryStream();

using(var db = new LiteDatabase(mem))

{

...

}




5.数据交叉引用(暂时没测通)



// DbRef to cross references

public class Order

{

public ObjectId Id { get; set; }

public DateTime OrderDate { get; set; }

public Customer Customer { get; set; }

public List<Product> Products { get; set; }

}



using(var db = new LiteDatabase(@"MyData.db"))

{

// Produts and Customer are other collections (not embedded document)

db.Mapper.Entity<Order>()

.DbRef(x => x.Products, "products")

.DbRef(x => x.Customer, "customers");



var orders = db.GetCollection<Order>("orders");



// When query Order, includes references

var query = orders

.Include(x => x.Customer)

.Include(x => x.Products)

.Find(x => x.OrderDate <= DateTime.Now);



}


6.使用日志

using (var db = new LiteDatabase(...))

{

db.Log.Level = Logger.FULL; //声明输出的日志级别,多个级别可以使用| 操作;如:Logger.ERROR|Logger.xxx|Logger.xxx

db.Log.Logging += delegate(string msg)//定义一个事件,接收内部日志

{

.... //接入自己的日志组件

};

var collName = "userinfo";

var coll = db.GetCollection<Common.TestAutoIdInfo>(collName);


for (; i < 100; i++)

{

//如果属性为 id 且为 int 类型,将自动自增.标记[BsonId(false)]不自增

var bv = coll.Insert(new Common.TestAutoIdInfo()

{

id = "11",

//user_id=i.ToString(),

name = i.ToString("D5"),

remark = Common.Remark

});

var n = bv.AsInt32;

Assert.IsTrue(n > 0);

}

}


举报

相关推荐

0 条评论