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

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)

代码说明

  1. $expr:允许在查询过滤器中使用聚合表达式,实现跨字段的比较逻辑。
  2. $size:聚合操作符,用于计算$stop.riders数组的长度(注意字段名前加$)。
  3. $gt:在聚合表达式中接收两个参数,第一个是要比较的字段$stop.expect,第二个是数组长度计算结果,实现stop.expect > stop.riders.length的逻辑。
  4. .toArray():MongoDB的find()方法返回的是游标对象,必须调用此方法才能获取实际的文档数组,否则打印的是游标而非查询结果。

测试验证

用你提供的示例数据:

{ "stop": { "expect":3, "riders": ["asd", "erw", "wer"] } },
{ "stop": { "expect":4, "riders": ["asq", "frw", "wbr"] } }

执行上述查询后,会返回第二个文档(因为4 > 3满足条件)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 19:55:15