使用比较字段值的逻辑表达式进行查询

时间:2017-06-15 17:46:35

标签: sql mongodb mongodb-query aggregation-framework

我需要做一个类似于SQL

的简单mongo查询
Select * from insights where category = 1 and param_count > param_mean + 1

1 个答案:

答案 0 :(得分:1)

理想情况下,您可以使用$redact作为聚合表达式,并使用初始$match至少可能使用非计算表达式的索引:

db.collection.aggregate([
   { "$match": { "category": 1 } },
   { "$redact": {
     "$cond": {
       "if": { "$gt": [ "$param_count", { "$add": [ "$param_mean", 1 ] } ] },
       "then": "$$KEEP",
       "else": "$$PRUNE"
     }
   }}
])

如果您的MongoDB"服务器"如果没有$redact运算符,版本小于2.6,那么您可以使用$where将JavaScript表达式计算为布尔值以返回结果:

db.collection.find({
  "category": 1,
  "$where": "this.param_count > this.param_mean + 1"
})

虽然语法较短,但由于需要评估JavaScript表达式,因此需要相当多的处理时间。

如果可能,那么您应该使用$redact,或者完全避免计算并将计算出的评估存储在文档中。最后一句话适用于"所有"数据库真的。