考虑在sql server中编写的这个查询,我将如何有效地将其转换为mongodb:
select * from thetable where column1 = column2 * 2
答案 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" } } ])
管道操作步骤: -
注意: - 的 在第一个流水线操作中,我将num2乘以1作为num1,num2作为整数存储,$ multiply返回double值。所以,如果我不使用$ mutiply用于num2,那么它会尝试匹配4等于4.0,这与文档不匹配。
答案 3 :(得分:0)