Mongodb:查找包含对子文档的引用的文档[node-mongodb-native]

时间:2013-07-22 03:58:41

标签: mongodb find

我有以下Mongodb文件:

Users : {'_id' : '12345', 'fullname' : 'ABC'}
and 
Files : 
        {'_id' : 'File001', 'path' : 'pathA', 'Users_id' : '12345'}
        {'_id' : 'File002', 'path' : 'pathB', 'Users_id' : '12345'}

如何以引用“用户”文档的“Users_id”具有完整的“用户”文档的方式查询或查找所有“文件”文档?

预期产出:

{'_id' : 'File001', 'path' : 'pathA', 'Users_id' : '12345', 'user' : {'_id' : '12345', 'fullname' : 'ABC'}}
{'_id' : 'File002', 'path' : 'pathB', 'Users_id' : '12345', 'user' : {'_id' : '12345', 'fullname' : 'ABC'}}

通过这种方式,我可以访问文件所有者的全名:file.user.fullname

我感谢你们的任何帮助。谢谢。

---编辑

我正在使用node-mongodb-native访问数据库。

以下是我检索它的代码:

var files = db.collection ('Files');

files.find ({}, {}).toArray (function ( err, filesDoc){
    for ( var index in filesDoc) {
        var fileDoc = filesDoc [ index ];
        var users = db.collection ('Users');
        users.findOne ({'_id' : fileDoc.Users_id}, {}, function (errUser, userDoc){
            if ( ! errUser ) {
                fileDoc.user = userDoc;
            }
        });
    }
});

但是此代码未将用户分配给所有文件doc,并且仅分配给filesDoc数组的最后一个元素。有什么建议吗?

2 个答案:

答案 0 :(得分:3)

MongoDB不支持联接,因此您必须单独查询用户详细信息。如果您使用的是node.js,则Mongoose会提供populate功能来帮助简化此操作,以便您可以执行以下操作来提取用户详细信息:

Files.find().populate('Users_id')

答案 1 :(得分:0)

我设法找到了问题的原因。我的代码返回null用户的原因是因为我将File.Users_id保存为String并且我使用ObjectId检索它。

我通过在保存文件之前将Users_id字符串转换为ObjectId来修复我的代码。