【问题标题】:How to convert this sql query to mongodb如何将此 sql 查询转换为 mongodb
【发布时间】:2017-02-12 02:42:10
【问题描述】:

考虑到这个用 sql server 编写的查询,我将如何有效地将其转换为 mongodb:

select * from thetable where column1 = column2 * 2

【问题讨论】:

    标签: sql mongodb mongodb-query aggregation-framework


    【解决方案1】:

    您可以使用以下聚合。

    您投影一个新字段 comp 来计算表达式值,然后是 $match 以保留具有 eq(0) 值的文档和 $project 排除以删除 comp 字段。

    db.collection.aggregate([
       { $addFields: {"comp": {$cmp: ["$column1",  {$multiply: [ 2, "$column2" ]} ]}}},
       { $match: {"comp":0}},
       { $project:{"comp":0}}
    ])
    

    【讨论】:

      【解决方案2】:

      如果您想在 mongo Shell 中运行查询, 试试下面的代码,

      db.thetable .find({}).forEach(function(tt){
          var ttcol2 = tt.column2 * 2
          var comapreCurrent =  db.thetable.findOne({_id : tt._id,column1 : ttcol2});
          if(comapreCurrent){
             printjson(comapreCurrent);
          }
      });
      

      【讨论】:

        【解决方案3】:

        我喜欢@Veeram 发布的答案,但也可以使用 $project 和 $match 管道操作来实现这一点。 这只是为了理解流程

        假设我们将以下 2 个文档存储在 math 集合中

        Mongo 文档

        { "_id" : ObjectId("58a055b52f67a312c3993553"), “num1”:2, “数字2”:4 } { "_id" : ObjectId("58a055be2f67a312c3993555"), “num1”:2, “数字2”:6 }

        现在我们需要找出 num1 = num2 的 2 倍(在我们的例子中,带有 _id ObjectId("58a055b52f67a312c3993553") 的文档将匹配此条件)

        查询:

        db.math.aggregate([ { “$项目”:{ “数字2”:{ "$multiply": ["$num2",1] }, “全部的”: { "$multiply": ["$num1",2] }, “文档”:“$$ROOT” } }, { “$项目”:{ "areEqual": {"$eq": ["$num2","$total"] }, 文档:1 } }, { “$匹配”:{ “均等”:真 } }, { “$项目”:{ “_id”:1, "num1": "$doc.num1", "num2": "$doc.num2" } } ])

        流水线操作步骤:-

        • 第一次流水线作业$project 计算总数
        • 第二次流水线操作$project用于检查总 匹配 num2。这是必需的,因为我们不能使用比较 $match管道操作中num2与total的操作
        • 如果 areEqual 为真,则第 3 个管道操作匹配
        • 第 4 次管道操作 $project 仅用于投影字段

        注意:- 在第一个管道操作中,我将 num2 乘以 1,因为 num1 和 num2 存储为整数, $multiply 返回双精度值。因此,如果我不将 $mutiply 用于 num2,那么它会尝试匹配 4 等于 4.0,这将不匹配文档。

        【讨论】:

          【解决方案4】:

          当单个 $redact 管道就足够时,当然不需要多个管道阶段,因为它完美地结合了 $project$match 的功能 流水线步骤。考虑运行以下管道以实现高效查询:

          db.collection.aggregate([
              { 
                  "$redact": { 
                      "$cond": [
                          { 
                              "$eq": [ 
                                  "$column1", 
                                  { "$multiply": ["$column2", 2] }
                              ] 
                          },
                          "$$KEEP",
                          "$$PRUNE"
                      ]
                  }
              }
          ])
          

          在上面,$redact 将返回所有使用 $$KEEP 匹配条件的文档,并丢弃那些使用 @ 不匹配的文档987654326@ 系统变量。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-01-03
            • 1970-01-01
            • 2021-05-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多