【发布时间】:2017-02-12 02:42:10
【问题描述】:
考虑到这个用 sql server 编写的查询,我将如何有效地将其转换为 mongodb:
select * from thetable where column1 = column2 * 2
【问题讨论】:
标签: sql mongodb mongodb-query aggregation-framework
考虑到这个用 sql server 编写的查询,我将如何有效地将其转换为 mongodb:
select * from thetable where column1 = column2 * 2
【问题讨论】:
标签: sql mongodb mongodb-query aggregation-framework
您可以使用以下聚合。
您投影一个新字段 comp 来计算表达式值,然后是 $match 以保留具有 eq(0) 值的文档和 $project 排除以删除 comp 字段。
db.collection.aggregate([
{ $addFields: {"comp": {$cmp: ["$column1", {$multiply: [ 2, "$column2" ]} ]}}},
{ $match: {"comp":0}},
{ $project:{"comp":0}}
])
【讨论】:
如果您想在 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);
}
});
【讨论】:
我喜欢@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" } } ])流水线操作步骤:-
注意:- 在第一个管道操作中,我将 num2 乘以 1,因为 num1 和 num2 存储为整数, $multiply 返回双精度值。因此,如果我不将 $mutiply 用于 num2,那么它会尝试匹配 4 等于 4.0,这将不匹配文档。
【讨论】:
【讨论】: