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);
}
}
用着挺方便,所以推荐下。
对于我的应用场景它还有如下不足:
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);
}
}
相关文章推荐
- UITool 2
- Android移植NDK子项目--以android-gif-drawable为例
- SQL Server创建复合索引时,复合索引列顺序对查询的性能影响
- Latex 设置文字大小
- Git pull 拉取远程内容强制覆盖本地文件
- redis启用持久化
- LinearLayout与RelativeLayout
- python logging模块
- iOS开发 - 模拟苹果通讯录
- Android动画
- win7 64位安装redis 及Redis Desktop Manager使用
- CSS学习(三)
- Emacs代码折叠
- 【leetcode】357. Count Numbers with Unique Digits【M】【72】
- twisted(2)--聊天系统
- java double类型保留两位小数4种方法
- 再谈搜索已死,推荐上位
- 裸机代码(uboot) : clear bss
- 001——response生成图片验证码
- POJ3680最小费用最大流