【问题标题】:Find based on calculated difference根据计算的差异查找
【发布时间】:2017-12-20 08:31:25
【问题描述】:

我需要根据一些参数查询我的 Mongo DB。但是,要获取参数,无论如何我首先需要使用 find() ,然后进行一些计算。

这显然是没有效率的。

让我详细说明:

这是我要查询的收藏:

{
  "title": "1",
  "description": "1",
  "aCounter": 100,
  "bCounter": 20,
  "__v": 0
}

我想查找 aCounter - bCounter 大于 50 的帖子。

我已经准备好模型和一切,但不知道在 find() 参数中放入什么。

postModel.find({
  //I don't know what to put here
})
.exec(function(err, posts) {
  if(posts){
    //return the data
  }
});

任何输入都会有所帮助。

谢谢

【问题讨论】:

    标签: mongodb mongoose mongodb-query aggregation-framework


    【解决方案1】:

    两种选择:

    使用$where

    postModel.find({ "$where": "(this.aCounter - this.bCounter) > 50" })
    

    或者实际上将$redact.aggregate() 一起使用会更高效:

    postModel.aggregate([
      { "$redact": {
        "$cond": { 
          "if": {
            "$gt": [
              { "$subtract": [ "$aCounter", "$bCounter" ] },
              50
            ]
          },
          "then": "$$KEEP",
          "else": "$$PRUNE"
        }
      }}
    ])
    

    后者确实更好,因为它使用“本机编码”运算符,而不是 $where 使用的 JavaScript 评估。

    但在可能的情况下,两者都应与正则查询表达式结合使用,因为两者都不能真正使用索引来单独加速结果。

    【讨论】:

    • 解决方案 2 对我有用。谢谢。我还有一些其他问题(需要嵌套算术计算以找到比率),但我不想劫持这篇文章。
    • @ShayanKhan 所以你should not when an answer addresses the actual question asked。如果您有不同的要求,那么正确的程序是 1. 从给出的答案中学习,以便应用问题中未表示的实际要求。 2. Ask a new Question 如果您不确定如何根据您的实际需求调整答案。在任何情况下,您都不应 A. 更改您的帖子或答案 B. 提供与所要求的问题不同的要求的答案。
    • 知道了,伙计。谢谢
    猜你喜欢
    • 1970-01-01
    • 2019-08-24
    • 2020-12-29
    • 1970-01-01
    • 2017-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-25
    相关资源
    最近更新 更多