MongoDB查询中如何实现同一文档内两个字段的比较?
完全可以实现该查询
MongoDB原生就支持单文档内两个字段的对比查询,和你列的SQL逻辑效果完全一致,有两种常见实现路径,优先推荐性能更优的方案。
3.6及以上版本推荐写法
用内置的$expr操作符即可实现——这个操作符允许在查询条件里使用聚合表达式,直接引用当前文档的字段值做逻辑计算,对应你需求的查询代码是:
db.game.find({ $expr: { $gt: ["$points", "$opp_points"] } })
跑你给出的示例文档集时,这条查询只会返回team: "A"的记录:因为它的points(101)大于opp_points(100),而B队的记录两个字段不满足大小关系,会被自动过滤。
这个方案的优势是查询优化器可以正常介入处理,后续数据量大了还能搭配计算索引优化查询性能,是目前最稳妥的实现方式。
老旧版本兼容方案(非必要不使用)
如果用的是MongoDB 3.6之前的旧版本,没有$expr能力,可以用$where传入JavaScript表达式实现对比,写法为:
db.game.find({ $where: "this.points > this.opp_points" })
但这个方案的硬伤很明显:
- 执行时需要对集合内的每一条文档做JavaScript解析运算,完全无法利用普通索引加速,会触发全表扫描,数据量上来后延迟会非常明显
- 存在代码注入的潜在风险,不适合直接在生产环境用
只要版本允许,优先用前面的$expr写法即可。
内容的提问来源于stack exchange,提问作者unltd_J
相关产品推荐
相关产品推荐

