MongoDB中如何通过计算值范围过滤文档(避免重复计算年龄)
优化MongoDB年龄区间查询:避免重复计算
你可以通过两种方式避免重复计算年龄,同时实现区间过滤:
方法一:用聚合管道先算年龄再过滤
通过$addFields先统一计算出age虚拟字段,再用$match做过滤,这样$dateDiff只会执行一次:
db.people.aggregate([ // 计算年龄并添加为临时字段 { $addFields: { age: { $dateDiff: { startDate: "$dateOfBirth", endDate: "$$NOW", unit: "year" } } } }, // 过滤年龄区间 { $match: { age: { $gte: 18, $lte: 35 } } } ])
如果不需要把age字段返回给结果,再加个$project移除它就行:
db.people.aggregate([ { $addFields: { age: { $dateDiff: { startDate: "$dateOfBirth", endDate: "$$NOW", unit: "year" } } } }, { $match: { age: { $gte: 18, $lte: 35 } } }, { $project: { age: 0 } // 移除临时age字段,只返回原文档内容 } ])
方法二:在查询条件里用$let定义变量
不想走聚合管道的话,直接在find的$expr里用$let定义一个age变量,只计算一次就能完成上下限判断:
db.people.find({ $expr: { $let: { vars: { age: { $dateDiff: { startDate: "$dateOfBirth", endDate: "$$NOW", unit: "year" } } }, in: { $and: [ { $gte: ["$$age", 18] }, { $lte: ["$$age", 35] } ] } } } })
适用场景
- 要是后续还要做其他聚合操作,或者需要保留
age字段,选聚合管道的方法更合适; - 只是单纯过滤文档,用
$let的写法更紧凑高效。
内容的提问来源于stack exchange,提问作者Guss
相关产品推荐
相关产品推荐

