MongoDB查询:筛选字段值大于数组长度的文档(ExpressJS+MongoClient)
解决MongoDB跨字段比较查询的问题
问题分析
你之前的两种写法都存在语法或逻辑错误:
- 第一种写法:普通查询条件里不能用
$size这类聚合操作符来引用其他字段的值,$gt无法直接识别{ $size: "stop.riders"}作为比较值,所以返回空列表。 - 第二种写法:字段引用没有加
$前缀(MongoDB聚合表达式中必须用$引用字段),且语法结构不完整,导致无法编译。
正确写法
要实现文档内字段值与数组长度的比较,必须使用$expr来启用聚合表达式,这样才能在查询中引用并计算文档内的多个字段。结合你的需求,正确代码如下:
const db = ref() const c = db.collection(t) const docs = await c.find({ "stop.time": { $gt: new Date().toISOString() }, $expr: { $gt: ["$stop.expect", { $size: "$stop.riders" }] } }).toArray() // 注意:find返回的是游标,需要调用toArray()获取实际文档列表 console.log(docs)
代码说明
$expr:允许在查询过滤器中使用聚合表达式,实现跨字段的比较逻辑。$size:聚合操作符,用于计算$stop.riders数组的长度(注意字段名前加$)。$gt:在聚合表达式中接收两个参数,第一个是要比较的字段$stop.expect,第二个是数组长度计算结果,实现stop.expect > stop.riders.length的逻辑。.toArray():MongoDB的find()方法返回的是游标对象,必须调用此方法才能获取实际的文档数组,否则打印的是游标而非查询结果。
测试验证
用你提供的示例数据:
{ "stop": { "expect":3, "riders": ["asd", "erw", "wer"] } }, { "stop": { "expect":4, "riders": ["asq", "frw", "wbr"] } }
执行上述查询后,会返回第二个文档(因为4 > 3满足条件)。
内容的提问来源于stack exchange,提问作者user11107939
相关产品推荐
相关产品推荐

