考慮這個查詢編寫SQL Server中我將如何有效地將它的MongoDB:如何轉換這個SQL查詢的MongoDB
select * from thetable where column1 = column2 * 2
考慮這個查詢編寫SQL Server中我將如何有效地將它的MongoDB:如何轉換這個SQL查詢的MongoDB
select * from thetable where column1 = column2 * 2
您可以使用下面聚集。
您項目的新領域comp
計算表達式的值,然後$match
保持文檔與EQ(0)值和$project
與排斥下降comp
領域。
db.collection.aggregate([
{ $addFields: {"comp": {$cmp: ["$column1", {$multiply: [ 2, "$column2" ]} ]}}},
{ $match: {"comp":0}},
{ $project:{"comp":0}}
])
如果你想運行在蒙戈殼牌查詢, 嘗試下面的代碼,
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);
}
});
我喜歡張貼@Veeram的答案,但它也有可能實現這一目標使用$項目和$匹配流水線操作。 這僅僅是理解流動
假設我們有存儲在數學收集
蒙戈文件
{ "_id" : ObjectId("58a055b52f67a312c3993553"), "num1" : 2, "num2" : 4 } { "_id" : ObjectId("58a055be2f67a312c3993555"), "num1" : 2, "num2" : 6 }
下面的2個文件現在我們需要找到,如果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" } } ])
流水線操作步驟: -
注: - 在第1流水線操作我成倍NUM2 1爲NUM1和NUM2存儲爲整數,$乘返回double值。因此,如果我不使用$ mutiply作爲num2,那麼它會嘗試匹配4等於4.0,這與文檔不匹配。