您的位置:首页 > 其它

LiteDB v.2.0.0-rc 使用介绍

2016-06-21 17:43 429 查看
在寻找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);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: