LiteDB是专为.NET设计的轻量级嵌入式NoSQL数据库,适合桌面应用、IoT、CLI工具及原型开发;不适合高并发写入、复杂事务或多用户共享访问。

LiteDB 是什么,适合什么场景
LiteDB 是一个轻量级、零配置、单文件的 NoSQL 嵌入式数据库,专为 .NET 设计。它不依赖服务进程,不需安装,直接通过 NuGet 引用 LiteDB 包就能用。适合桌面应用、IoT 设备、CLI 工具、原型开发等需要本地持久化但不想搭 MongoDB 或 SQLite(关系型)的场景。
- 不适合高并发写入、复杂事务、多用户共享访问
- 支持 BsonDocument 和强类型 POCO,自动序列化/反序列化
- 默认使用
LiteDatabase单例模式打开文件,同一进程内多个实例可能引发文件锁冲突
如何初始化并插入一条数据
用 LiteDatabase 打开一个 .db 文件路径,获取 LiteCollection 后调用 Insert 即可。注意:路径必须可写,且目录存在(LiteDB 不自动创建父目录)。
using var db = new LiteDatabase(@"C:\data\users.db"); var users = db.GetCollection("users"); users.Insert(new User { Id = ObjectId.NewObjectId(), Name = "Alice", Age = 30 });
-
ObjectId是 LiteDB 自带的主键类型,推荐作为_id字段(类中字段名必须是_id或加[BsonId]特性) - 如果没定义
_id,LiteDB 会自动生成并写入,但强类型建议显式声明 - 插入后不调用
db.Dispose()或 using 会导致文件句柄未释放,后续打开失败
查询数据时为什么查不到,常见错误有哪些
最常踩的坑是字段名大小写不一致或未正确映射。LiteDB 默认按属性名(非字段名)映射,且区分大小写;若类中用 public string name { get; set; }(小写),而查询用 name == "Alice",能查到;但若实际存的是 Name(PascalCase),而查询写成 name == "Alice" 就为空。
- 查询必须用 LINQ 表达式,
Find(x => x.Name == "Alice")是对的,Find("Name == 'Alice'")(字符串查询)已弃用且不推荐 -
FindAll()返回所有,但大数据集慎用,无索引时是全表扫描 - 没建索引的字段做
Where条件,性能随数据量线性下降 - 若实体类有只读属性(
get无set),LiteDB 默认跳过,不会报错但也不存值
如何安全地在多线程中使用 LiteDB
LiteDB 的 LiteDatabase 实例不是线程安全的。官方明确要求:每个线程应有自己的 LiteDatabase 实例,或复用同一个实例但确保串行访问(比如加锁)。
- ✅ 推荐方式:每次操作都新建
LiteDatabase(开销极小,底层有连接池优化) - ❌ 错误方式:全局静态
LiteDatabase实例被多个线程同时调用Insert/Find - 若必须复用,可用
lock包裹集合操作,但会牺牲并发吞吐 - 长期运行的服务中,避免让
LiteDatabase实例存活过久(如 static),因内部缓存和文件句柄可能累积
LiteDB 看似简单,但字段映射规则、线程模型、索引缺失导致的静默性能退化,这三点最容易在上线后才暴露。










