如何将此sql查询转换为mongodb

时间:2017-02-12 02:42:11

标签: sql mongodb mongodb-query aggregation-framework

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

select * from thetable where column1 = column2 * 2

4 个答案:

答案 0 :(得分:4)

您可以使用以下聚合。

您投影新字段comp以计算表达式值,然后$match将文档保留为eq(0)值,$project排除comp领域。

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

答案 1 :(得分:1)

如果要在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);
    }
});

答案 2 :(得分:0)

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

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

Mongo文件


    {
        "_id" : ObjectId("58a055b52f67a312c3993553"),
        "num1" : 2,
        "num2" : 4
    }

    {
        "_id" : ObjectId("58a055be2f67a312c3993555"),
        "num1" : 2,
        "num2" : 6
    }

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

查询:


    db.math.aggregate([
      {
        "$project": {
          "num2": {
            "$multiply": ["$num2",1]
          },
          "total": {
            "$multiply": ["$num1",2]
          },
          "doc": "$$ROOT"
        }
      },
      {
        "$project": {
          "areEqual": {"$eq": ["$num2","$total"]
          },
          doc: 1
        }
      },
      {
        "$match": {
          "areEqual": true
        }
      },
      {
        "$project": {
          "_id": 1,
          "num1": "$doc.num1",
          "num2": "$doc.num2"
        }
      }
    ])

管道操作步骤: -

  • 第一个管道操作$ project计算总数
  • 第二个管道操作$项目用于检查总数 匹配num2。这是必要的,因为我们不能使用比较 在$ match管道操作中使用total操作num2。
  • 如果areEqual为true,则第3个管道操作匹配
  • 第4个管道操作$项目仅用于投影字段

注意: - 在第一个流水线操作中,我将num2乘以1作为num1,num2作为整数存储,$ multiply返回double值。所以,如果我不使用$ mutiply用于num2,那么它会尝试匹配4等于4.0,这与文档不匹配。

答案 3 :(得分:0)

当单个 $redact 管道足以完美地整合 $project 的功能时,当然不需要多个管道阶段> $match 管道步骤。考虑运行以下管道以进行有效查询:

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

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