Mongodb聚合$在数组元素的字段中

时间:2015-11-15 17:06:53

标签: mongodb mongodb-query aggregation-framework

文件结构

会议文件:

{
    "_id" : ObjectId("5648b811a16bc2e0355b8289"),
    "title" : "test",
    "messages" : [
        {
            "authorId" : ObjectId("5648b89f2fc311bc39073993"), // <-- the users id
            "created" : ISODate("2015-11-15T16:51:29.652Z"),
            "message" : "<p>test</p>"
        }
    ]
}

用户文档:

"_id" : ObjectId("5648b89f2fc311bc39073993"),
"pic" : "karl.png",
"profile" : {
    "name" : "Karl Morrison"
}

查询

第一次查询:

var id = '5648b811a16bc2e0355b8289'; // <-- id for the session document
var session = // <-- returns the session document
    yield sessions.findOne({
        _id: id,
    });

第二个查询(这是我被困的地方):

var sessionUsers =
        yield new Promise(function (resolve, reject) {
            users.col.aggregate([
                    {
                        $match: {
                            '_id': {
                                '$in': session.messages.authorId // <--- here I need help! Need all of the authorId's in the session document from the previous query result.
                            }
                        }
                                },
                    {
                        $project: {
                            _id: 1,
                            pic: 1,
                            name: '$profile.name'
                        }
                    }
                ],
                function (err, res) {
                    if (err === null)
                        resolve(res);
                    reject(err);
                });
        });

问题

所以我试图将所有authorId放入一个数组中并将该数组提供给第二个查询的$in,该查询应返回一个包含字段的元素的数组。 _idpicname

所以sessionUsers变量看起来像这样:

[{
    "_id" : ObjectId("5648b89f2fc311bc39073993"),
    "pic" : "karl.png",
    "name" : "Karl Morrison"
},...]

1 个答案:

答案 0 :(得分:1)

我不确定我是否正确理解了问题,但我认为您正在尝试发送一组对象而不是$match后面的_id数组。您需要将所有_id放在一个简单的数组中并使用结果。您可以使用lodash。以下是docs以获取更多信息。

以下代码&#34;采摘&#34;所有_id来自您的会话数据。

var ids = _.pluck(session.messages, 'author‌Id');

接下来,将$match部分更改为:

{
    $match: {
        '_id': {
            '$in': ids
        }
    }
}