Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB使用附加信息查询引用_Mongodb - Fatal编程技术网

MongoDB使用附加信息查询引用

MongoDB使用附加信息查询引用,mongodb,Mongodb,我将组织的数据存储在以下文档结构中: { "_id":ObjectId("52ffc33cd85242f436000001"), "name": "NASA", "users" : [ { "_id" : ObjectId("5629f0b20fe85c57ed459913"), "level" : "organization_lead" }, {

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

{
    "_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",
}
获取属于特定组织的用户文档列表的最有效方法是什么

如果用户数组中只有_id,我会将该数组传递给另一个查询以获取用户,但是在这种情况下我应该怎么做?或者有没有更好的方法来获取包含附加信息的引用?

使用组织集合的光标的方法来迭代、访问循环中的文档并调用方法来获取每个用户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);     
})
使用组织集合的光标的方法进行迭代,访问循环中的文档,并调用方法以获取每个用户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);     
})
使用填充

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"
    }
]}]
使用填充

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

你可以,或者。如果没有“嵌入”(非规范化),您必须执行第二个查询来查找用户;您可以通过构建一个要搜索的用户ID数组,然后:
{$in:userIDArray}
其中
userIDArray=[ObjectId(“…”)、ObjectId(“…”)、…]
。您在“users”集合中的文档是什么样子的?预期的结果是什么?请使用添加到您的问题的来添加这些信息。我添加了用户集合文档结构。您可以,或。如果没有“嵌入”(非规范化),您必须执行第二个查询来查找用户;您可以通过构建一个要搜索的用户ID数组,然后:
{$in:userIDArray}
其中
userIDArray=[ObjectId(“…”)、ObjectId(“…”)、…]
。您在“users”集合中的文档是什么样子的?预期的结果是什么?请使用添加到您的问题的来添加这些信息。我添加了用户集合文档结构。由于操作员的工作方式,您的第一次查询将不会返回任何文档。我看到您编辑了您的帖子,但这并没有使事情变得更好。你不应该在哪里使用
$where
我想你知道为什么。使用点表示法代替
“users.0”:{“$exists”:true}
。但是我不清楚这个问题,因为我不知道预期的结果。@user3100115谢谢你的更正。如果OP有足够的信息来消除猜测,我会很有帮助。不过我很感谢你的输入。由于操作员的工作方式,你的第一次查询不会返回任何文档。我看到你编辑了你的帖子,但这并没有让事情变得更好。你不应该在哪里使用
$where
我想你知道为什么。使用点表示法代替
“users.0”:{“$exists”:true}
。但是我不清楚这个问题,因为我不知道预期的结果。@user3100115谢谢你的更正。如果OP有足够的信息来消除猜测,我会很有帮助的。不过,我很感谢你的意见。