You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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();

原因说明

  1. 路径写法错误:无需使用$.PhoneBooks[*].Id这种格式,直接写PhoneBooks.Id即可让LiteDB遍历数组中的每个元素进行匹配;
  2. ALL和ANY的误用:ALL要求数组中所有元素的Id都在指定列表中,这和需求不符;而你之前的ANY写法因为路径错误导致无法匹配。直接使用Query.In在数组嵌套属性上,LiteDB默认会判断数组中是否存在任意一个元素满足条件,正好符合需求。

内容的提问来源于stack exchange,提问作者Stephan Steiner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 17:12:48