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

MongoDB查询中如何使用文档字段?含时间条件查询需求

嘿,我来帮你搞定这两个MongoDB的问题!

1. 如何在查询中使用文档字段?

常规的MongoDB查询过滤器里,右边的值默认会被当作常量处理,没办法直接引用其他文档字段来做比较。要实现字段间的运算或者引用,你得用**$expr操作符**(MongoDB 3.6及以上支持)或者在聚合管道里操作。

举个实际例子:如果你想找出所有score字段大于pass_score字段的文档,用$expr的写法是这样的:

db.yourCollection.find({
  $expr: { $gt: ["$score", "$pass_score"] }
})

要是你在使用聚合管道,也可以在$match阶段里用同样的逻辑:

db.yourCollection.aggregate([
  {
    $match: {
      $expr: { $gt: ["$score", "$pass_score"] }
    }
  }
])

$expr支持绝大多数聚合表达式,除了字段比较,还能做加减乘除、逻辑组合之类的操作,基本能覆盖你需要引用字段的场景。

2. 筛选满足from < now且to > (now + delay)的文档

这个需求涉及到自定义变量和文档字段的运算,同样得靠$expr来实现。首先先定义好你的now变量(比如是当前时间的Date对象或者时间戳),然后把两个条件用$and组合起来:

假设now是当前时间的Date对象:

const now = new Date(); // 或者用 Date.now() 获取毫秒级时间戳

对应的查询语句如下:

db.yourCollection.find({
  $expr: {
    $and: [
      { $lt: ["$from", now] }, // 满足 from < now
      { $gt: ["$to", { $add: [now, "$delay"] }] } // 满足 to > now + delay
    ]
  }
})

这里要注意:如果你的delay字段不是数值类型(比如存在字符串格式的数字),得先把它转成数值再运算,比如用$toLong或者$toDouble:

{ $gt: ["$to", { $add: [now, { $toLong: "$delay" }] }] }

这样就能避免类型不匹配导致的运算错误啦。

内容的提问来源于stack exchange,提问作者Егор Лебедев

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:30:16