在单个数据文件中,LiteDB. NET NoSQL 文档存储

分享于 

8分钟阅读

数据库

  繁體

介绍

本文概述了数据库项目LiteDB-一个小型、快速、免费的嵌入式项目,NET NoSQL文档存储。

特征

  • 无服务器NoSQL文档存储
  • 简单的API非常类似于MongoDB Official Driver
  • 100%的C#代码。单个DLL(小于200 kb)中的NET 3.5-无依赖项
  • 支持便携式平台:完整。NET,UWP 8.1 /10, Xarmin iOS和Android
  • 事务控制-ACID
  • 写入故障恢复(日志模式)
  • 支持POCO类或BsonDocument
  • 使用DES加密的加密数据文件
  • 用于文件和流数据的FileStorage(例如MongoDB中的GridFS)
  • 单数据文件存储(如SQLite )
  • 用于快速搜索的索引文档字段(每个集合最多16个索引)
  • 对查询的Inital LINQ支持
  • shell命令行(尝试此联机版本)
  • 开源,对所有人免费-包括商业用途
  • 从NuGet安装:Install-Package LiteDB或Install-Package LiteDB.Core(适用于便携式)
  • v2.0的新增功能

  • 抽象持久层-现在你的数据文件可以是流,也可以实现你自己的持久层
  • 使用Fluent API映射实体类,如Entity Framework
  • 跨实体关系的更好解决方案(交叉引用):您的域类与LiteDB实现完全脱钩。
  • 新的清理缓存系统,在大型事务中避免过多的内存使用(使用日志文件)
  • 支持初始数据库大小和最大数据库大小
  • 使用DES加密加密数据文件
  • 延迟加载-仅在访问数据时打开数据文件
  • 更好地支持并发写入
  • 收缩数据文件
  • 数据库日志信息
  • MongoDB对LiteDB有很大的启发。我试图创建一个像MongoDB这样的数据库,但在一个非常小的规模中,只使用小应用程序最重要的特性,如果您了解MongoDB,那么您已经了解LiteDB。

    如何使用

    存储和搜索文档的快速示例:

    // Open data file (or create if not exits)using(var db = new LiteDatabase(@"C:TempMyData.db"))
    {
     // Get customer collectionvar col = db.GetCollection<Customer>("customers");
     var customer = new Customer { Id = 1, Name = "John Doe" };
     // Insert new customer document col.Insert(customer);
     // Update a document inside a collection customer.Name = "Joana Doe";
     col.Update(customer);
     // Index document using a document property col.EnsureIndex(x => x.Name);
     // Simple Linq supportvar result = col.Find(x => x.Name.StartsWith("Jo"));
    }

    在哪里使用?

  • 小型Web应用程序,网站博客或论坛
  • 每个帐户/用户数据存储一个数据文件
  • 桌面/本地小型应用程序
  • 应用程序文件格式
  • 很少的并发编写用户操作
  • 快速启动

    如果需要更多文档,可以阅读github Wiki文档

    文件

    LiteDB使用文档来存储和检索数据内部数据文件,文档定义可以是POCO类或BsonDocument类,在这两种情况下,LiteDB将以BSON格式将文档转换为存储内部磁盘。

    BSON是一个二进制JSON,它是将数据对象存储为二进制数组的序列化,在BSON中,我们有比JSON更多的数据类型,比如DateTime,Guid和ObjectId。

    使用POCO类的文档

    POCO类是只使用get/set属性的简单c类,这是创建强类型文档的最好方法,你的类必须有标识符属性,可以使用名为property的Id,< ClassName > Id或用[BsonId]属性修饰属性。

    // A poco entity, must have Idpublicclass Customer
    {
     publicint Id { get; set; }
     publicstring Name { get; set; }
     public List<Phone> Phones { get; set; }
    }// It's not a entity, don't need Idpublicclass Phone
    {
     publicint Code { get; set; }
     publicstring Number { get; set; }
     public PhoneType Type { get; set; }
    }publicenum PhoneType { Mobile, Landline } 
  • 内部,文档id表示为"_id"属性
  • 不使用复杂数据类型(如DataSet,DataTable )
  • 不使用一次性对象(如Stream,Graphics )
  • 序列化时,枚举将在字符串中转换
  • 你的Id值必须是唯一的且不为null
  • 如果将Id保留为空,就LiteDB将在插入时自动生成
  • Mapper约定

    BsonMapper.ToDocument()自动转换文档字段中的每个属性类遵循以下约定:

  • 必须使用公共非参数构造函数来声明类
  • 属性必须是公开的
  • 属性可以是只读或读/写
  • 类必须有Id属性,< ClassName > Id属性或有[BsonId]属性的属性来存储Id信息
  • 可以用[BsonIgnore]修饰属性,以不映射到文档
  • 可以使用[BsonField]来修饰属性,以有自定义名称字段
  • 不允许循环引用
  • 最大20个深度内部类
  • 类字段未转换为文档
  • BsonMapper使用缓存映射信息的全局实例以获得更好的性能,此实例也位于LiteDatabase.Mapper属性上
  • 用于文档映射的Fluent API

    如果要更改默认约定映射,可以使用EntityBuilder将实体类映射到BsonDocument。

    var mapper = BsonMapper.Global;
    mapper.Entity<Customer>()
    . Id(x => x.CustomerKey)
    . Field(x => x.Name, "customer_name")
    . Ignore(x => x.Age)
    . Index(x => x.Name, unique);

    DbRef用于交叉文档收集参考

    LiteDB可以使用跨文档参照来仅使用_id值来映射内部实体(不嵌入子文档)。

    // Your entity order classpublicclass Order
    {
     publicint OrderId { get; set; }
     public Customer Customer { get; set; }
    }
    ​​​// Map Customer property to"customers" collectionsBsonMapper.Global.Entity<Order>()
    . DbRef(x => x.Customer, "customers"); // When insert an order, only customer _id will be included as reference// Get orders collectionvar orders = db.GetCollection<Order>("orders");// Find an order including Customer referencevar order = orders
    . Include(x => x.Customer)
    . FindById(123);

    LiteDB将Order文档序列化为 { _id: 123, Customer: { $id:1, $ref:"customers" } }` 如果需要查询订单包括客户实例,只需在运行Find方法之前添加。

    使用BsonDocument的文档

    BsonDocument是一个特殊的类,它使用内部字典映射文档< string,object >,读取未知文档类型或用作一般文档非常有用。

    // Create a BsonDocument for Customer with phonesvar doc = new BsonDocument();
    doc["_id"] = ObjectId.NewObjectId();
    doc["Name"] = "John Doe";
    doc["Phones"] = new BsonArray();
    doc["Phones"].Add(new BsonObject());
    doc["Phones"][0]["Code"] = 55;
    doc["Phones"][0]["Number"] = "(51) 8000-1234";
    doc["Phones"][0]["Type"] = "Mobile";

    使用BsonDocument,你可以创建复杂的文档架构。


    数据  文件  DOC  Store  SIN  Nosql  
    相关文章