LiteDB 是一个轻量级的 .NET NoSQL 嵌入式数据库,完全用 C# 开发,支持跨平台(Windows、Linux、MacOS),并提供类似于 MongoDB 的简单 API。它以单文件形式存储数据,类似于 SQLite,支持事务和 ACID 特性,确保数据的一致性和可靠性。
优缺点分析
优点:
- 轻量级与嵌入式:无需复杂配置,可直接嵌入 .NET 应用。
- 跨平台支持:可在 Windows、Linux 和 MacOS 上运行。
- 高性能与低资源消耗:适合嵌入式设备和移动应用。
- 支持事务和 ACID 特性:确保数据操作的原子性、一致性、隔离性和持久性。
- 简单的 API:提供类似于 MongoDB 的简洁 API,易于使用。
- LINQ 查询支持:支持 LINQ 查询,使得查询操作更加直观。
- 单文件存储:数据存储在一个文件中,便于管理和备份。
- 数据保障:支持写前日志(WAL)机制,确保数据恢复能力。
缺点:
- 不适合大规模数据存储:在处理大量数据时可能会出现性能问题。大数据量(如百万级文档)可能导致性能下降,需结合索引优化。
- 并发支持有限:虽然线程安全,但在高并发场景下需谨慎使用。单文件架构在高并发写入时可能出现锁竞争,建议控制并发写入量。
- 功能相对简单:不支持复杂的查询和高级数据库特性。
- 社区支持较小:可能缺乏成熟的解决方案和文档。
使用注意事项
- 适用场景:适合小型项目和单用户应用程序。
- 索引优化:对常用查询字段创建索引,以提高查询性能。
- 事务管理:确保在事务中正确处理异常,避免数据不一致。
- 定期备份:定期备份数据库文件,防止数据丢失。
- 并发问题:在高并发场景下需谨慎使用,避免性能瓶颈。
常见业务的C#代码示例
1. 创建或者打开数据库
如果指定的文件不存在,LiteDB 会自动创建一个新的数据库文件;如果文件已经存在,则会打开该数据库。
LiteDB 主要通过 AES 加密算法 对数据库文件进行整体加密,支持在连接时通过密码参数启用,提供简单且高效的数据存储安全保护。
using LiteDB;
class Program
{
static void Main()
{
// 数据库文件路径
string dbPath = "MyDatabase.db";
// 数据库密码
string password = "MySecretPassword";
// 连接字符串,包含密码
string connectionString = $"Filename={
dbPath};Password={
password}";
using (var db = new LiteDatabase(connectionString))
{
// 现在可以使用 db 对象进行数据库操作了
}
}
}
2. 数据结构定义:文档与类的映射
LiteDB 是文档型数据库,数据以 BSON(Binary JSON)格式存储。通过定义 C# 类来映射文档结构,支持以下特性:
(1)基础类定义
public class Person
{
[BsonId] // 主键(自动生成或指定)
public int Id {
get; set; }
[BsonField("name")] // 自定义字段名
public string FullName {
get; set; }
public int Age {
get; set; }
public DateTime CreatedAt {
get; set; } = DateTime.UtcNow;
// 嵌套文档
public Address Address {
get; set; }
// 数组
public List<string> Tags {
get; set; }
}
public class Address
{
public string City {
get; set; }
public string Country {
get; set; }
}
(2)嵌套与数组优化
- 嵌套文档:直接在类中定义子对象,LiteDB 会自动序列化嵌套结构。
- 数组字段:使用 List 存储集合数据,避免过度嵌套(如多层数组)以提升查询性能。
- 避免深嵌套:超过 2 层的嵌套可能导致查询效率下降,建议拆分为独立集合。
(3)特殊类型处理
- 日期时间:使用 DateTime 类型,存储为 UTC 时间以避免时区问题。
- 字典:使用 Dictionary<string, object> 存储动态键值对,但需注意索引限制。
- 二进制数据:使用 byte[] 存储文件或图片,配合 GridFS 处理大文件。
3. 增、改、删、查询代码示例:
using LiteDB;
using System;
using System.Collections.Generic;
// 定义 Person 类
public class Person
{
[BsonId] // 主键(自动生成或指定)
public int Id {
get; set; }
[BsonField("name")] // 自定义字段名
public string FullName {
get; set; }
public int Age {
get; set; }
public DateTime CreatedAt {
</