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,提问作者Егор Лебедев
相关产品推荐
相关产品推荐

