LiteDB中能否索引嵌套集合内实体属性?支持指定条件查询
在LiteDB中为嵌套集合的Entity属性创建索引并执行查询
没问题!在LiteDB里,你完全可以给嵌套在Result里的Entity类属性创建索引,来优化你写的那种Any()查询。下面是具体的操作步骤和注意事项:
创建索引
要针对ExtractedEntities里的Value和Id属性创建索引,你需要使用LiteDB的EnsureIndex方法,并通过Select指定嵌套属性的路径:
单个属性索引
如果你需要分别针对Value和Id创建独立索引,可以这么写:
var collection = db.GetCollection<Result>("results"); // 为ExtractedEntities.Value创建索引 collection.EnsureIndex(r => r.ExtractedEntities.Select(ee => ee.Value)); // 为ExtractedEntities.Id创建索引 collection.EnsureIndex(r => r.ExtractedEntities.Select(ee => ee.Id));
复合索引
考虑到你的查询是同时匹配Value == "test"和Id == 1,创建复合索引会更适合,能让查询效率更高:
collection.EnsureIndex(r => new { Value = r.ExtractedEntities.Select(ee => ee.Value), Id = r.ExtractedEntities.Select(ee => ee.Id) });
查询支持
你写的这个查询语句是完全支持的:
collection.Find(r => r.ExtractedEntities.Any(ee => ee.Value == "test" && ee.Id == 1));
在创建了对应的索引之后,LiteDB会利用索引快速定位符合条件的文档,而不是全表扫描,性能会有明显提升。
额外小贴士
- 如果你嵌套的
ExtractedEntities集合数据量比较大,索引带来的性能提升会更显著; - 尽量使用较新版本的LiteDB,旧版本对嵌套集合的索引支持可能不够完善。
内容的提问来源于stack exchange,提问作者jondow
相关产品推荐
相关产品推荐

