我将组织的数据存储在以下文档结构中:
{
"_id":ObjectId("52ffc33cd85242f436000001"),
"name": "NASA",
"users" : [
{
"_id" : ObjectId("5629f0b20fe85c57ed459913"),
"level" : "organization_lead"
},
{
"_id" : ObjectId("5629ff550fe85c57ed459914"),
"level" : "team_member"
}
]
}
用户在另一个集合中,如下所示:
{
"_id" : ObjectId("5629ff550fe85c57ed459914"),
"email" : "bob@email.com",
"firstname" : "Bob",
"lastname" : "Green",
}
获取属于特定组织的用户文档列表的最有效方法是什么?
如果我在users数组中只有_id,我只是将该数组传递给另一个查询以获取用户,但在这种情况下该怎么做?或者是否有更好的方法来获得具有附加信息的参考?
答案 0 :(得分:0)
使用 forEach()
游标的 find()
方法进行组织集合迭代,访问循环中的文档并调用 findOne()
方法获取每个用户_id的完整用户文档,如下例所示:
db.organisation.find({ "name": "NASA", "users.0": { "$exists": true } }).forEach(function(doc){
var updatedUsers = doc.users.map(function(u){
var user = db.users.findOne({"_id": u._id});
user["level"] = u.level;
return user;
}
doc.users = updatedUsers;
printjson(doc);
})
答案 1 :(得分:0)
使用populate,
db.organisation.findOne({ "name": "NASA"}, function(err, response) {
db.Users.populate(response.user, {'path': _id, 'select': 'firstname lastname email'}, function(err, populatedUserData) {
console.log(populatedUserData);
});
});
输出将是,
[{
"_id":ObjectId("52ffc33cd85242f436000001"),
"name": "NASA",
"users" : [
{
"_id" : [{
"_id" : ObjectId("5629f0b20fe85c57ed459913"),,
"email" : "laurem@email.com",
"firstname" : "laurem",
"lastname" : "Ipsum"
}],
"level" : "organization_lead"
},
{
"_id" : [{
"_id" : ObjectId("5629ff550fe85c57ed459914"),
"email" : "bob@email.com",
"firstname" : "Bob",
"lastname" : "Green"
}],
"level" : "team_member"
}
]}]