MongoDB如何编写查询实现同文档内字段值大小比较
MongoDB同文档字段比较查询实现方案
MongoDB原生支持创建匹配同文档字段比较规则的查询,可通过标准语法实现同文档字段值的大小筛选。
原有写法失效原因
- 普通查询操作符(如
$lt、$gt)默认将右侧参数识别为固定常量,直接传入"$total"会被当作普通字符串处理,不会解析为当前文档的字段引用 $$this是聚合管道遍历数组时的上下文专属变量,无法直接在普通find查询的根级匹配条件中使用$where语法依赖服务端JavaScript引擎执行,查询性能极低,且在多数新版本MongoDB的默认安全配置、云厂商托管MongoDB实例中会被默认禁用,不属于推荐实现方案
正确查询写法
所有MongoDB 3.6及以上版本均支持使用$expr操作符实现字段比较,该操作符专门用于在查询条件中嵌入聚合表达式,支持直接引用当前文档的字段做运算、比较:
// 替换为实际集合名即可执行 db.collection.find({ $expr: { $gt: ["$total", "$paid"] } })
上述写法的逻辑为:匹配当前文档中total字段值大于paid字段值的所有文档,完全匹配需求。
如果后续需要搭配分组、投影、数组计算等更复杂的聚合逻辑,也可以在聚合管道的$match阶段使用完全相同的比较规则:
db.collection.aggregate([ { $match: { $expr: { $gt: ["$total", "$paid"] } } } // 后续可追加$group、$project等其他聚合阶段 ])
性能提示:
$expr是MongoDB原生实现的查询语法,性能远高于$where的JS执行方案,若比较字段存在合适的索引,查询效率会进一步提升。
内容的提问来源于stack exchange,提问作者Johnnes Souza
相关产品推荐
相关产品推荐

