LiteDB v.2.0.0-rc 使用介绍

来源:互联网 发布:网络院线 英文 编辑:程序博客网 时间:2024/05/02 04:29

在寻找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 0
原创粉丝点击