第一次查询:
db.a.find({
"type": ObjectId("50ed90f5a70defef23000002"),
"config.name": "alpha"
}, {
"user": 1
})
第一个查询结果:
{ "_id" : ObjectId("5684035c91b4693b39547591"), "user" : ObjectId("54ba80ac2735eea200623612") }
第2次查询:
db.users.find({
"_id": ObjectId("54ba80ac2735eea200623612")
}, {
"lastname": 1
})
我可以将这两个查询合并到一个查询中吗?第2个查询使用第一个查询结果的"user"
值ObjectId("54ba80ac2735eea200623612")
答案 0 :(得分:1)
您可以使用$match
与您的条件匹配的聚合,并$lookup
将您的本地字段user
映射到您的user
集合_id
字段:
db.a.aggregate(
[{
$match: {
"type": ObjectId("50ed90f5a70defef23000002"),
"config.name": "alpha"
}
}, {
$lookup: {
from: "users",
localField: "user",
foreignField: "_id",
as: "users"
}
}, {
$unwind: "$users"
}]);
在Javascript中,以mongoose
为例,您可以执行以下操作:
YourModel.aggregate(
[{
$match: {
"type": ObjectId("50ed90f5a70defef23000002"),
"config.name": "alpha"
}
}, {
$lookup: {
from: "users",
localField: "user",
foreignField: "_id",
as: "users"
}
}, {
$unwind: "$users"
}],
function(err, result) {
console.log("lastname : " + result.users.lastname);
});
答案 1 :(得分:0)
从MongoDB doesn't support joins开始,这不能合并到一个查询中。
您可以通过触发第一个查询,将结果存储在变量中然后使用它来触发第二个查询,直接从mongo shell直接执行此操作。
var userDoc = db.a.findOne({"type" : ObjectId("50ed90f5a70defef23000002"),"config.name":"alpha" },{"user":1});
db.users.find({"_id" : userDoc.user},{"lastname":1})
如果您的第一个查询返回多个结果,那么
var cursor = db.a.find({"type" : ObjectId("50ed90f5a70defef23000002"),"config.name":"alpha" },{"user":1});
cursor.forEach(function (userDoc) {
var user = db.users.findOne({"_id" : userDoc.user},{"lastname":1});
printjson(user);
})
注意:MongoDB从版本3.2开始支持left outer join using $lookup in aggregation pipeline
但在这种情况下,这似乎是一种矫枉过正。