LiteDB查询问题:查找含指定子文档ID的PhoneBookCategory
问题描述
对象模型
class PhoneBookCategory { public Guid Id { get; set; } public List<PhoneBook> PhoneBooks { get; set; } } class PhoneBook { public Guid Id { get; set; } }
需求
查询所有包含Id在指定Guid列表中的PhoneBook的PhoneBookCategory。
尝试的方法及问题
- 最初使用Linq语法,但LiteDB的Linq解析器不支持该写法:
List<Guid> myList = [Guid.NewGuid(), Guid.NewGuid()]; GetCollection<PhoneBookCategory>() .Find(u => u.PhoneBooks.Any(x => myList.Contains(x.Id)));
- 改用LiteDB原生查询语法后,出现异常结果:
- 使用
Query.In("$.PhoneBooks[*].Id ALL", bsArray)时,返回的是PhoneBooks为空或不存在的PhoneBookCategory; - 将
ALL替换为ANY后,无任何结果返回。
- 使用
解决方案
使用LiteDB原生查询时,正确的写法是直接指定数组字段的嵌套属性路径,LiteDB会自动处理数组元素的匹配判断:
List<Guid> myList = [Guid.NewGuid(), Guid.NewGuid()]; var bsArray = new BsonArray(myList); // 正确的查询:检查PhoneBooks数组中是否存在Id在指定列表中的元素 var query = Query.In("PhoneBooks.Id", bsArray); var result = GetCollection<PhoneBookCategory>().Find(query).ToList();
原因说明
- 路径写法错误:无需使用
$.PhoneBooks[*].Id这种格式,直接写PhoneBooks.Id即可让LiteDB遍历数组中的每个元素进行匹配; ALL和ANY的误用:ALL要求数组中所有元素的Id都在指定列表中,这和需求不符;而你之前的ANY写法因为路径错误导致无法匹配。直接使用Query.In在数组嵌套属性上,LiteDB默认会判断数组中是否存在任意一个元素满足条件,正好符合需求。
内容的提问来源于stack exchange,提问作者Stephan Steiner
相关产品推荐
相关产品推荐

