MongoDB使用附加信息查询引用

时间:2015-10-25 19:02:26

标签: mongodb

我将组织的数据存储在以下文档结构中:

{
    "_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,我只是将该数组传递给另一个查询以获取用户,但在这种情况下该怎么做?或者是否有更好的方法来获得具有附加信息的参考?

2 个答案:

答案 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"
    }
]}]