从聚合中返回整个文档

时间:2014-01-10 19:49:57

标签: mongodb aggregation-framework

我正在使用以下查询来获取数据库中每个帖子的最新评论:

db.comments.aggregate([
    {
        "$match": {
            "post_id": {
                "$in": [ObjectId("52c5ce24dca32d32740c1435"), ObjectId("52c5ce24dca32d32740c15ad")]
            }
        }
     },
     {
         "$sort": {"_id": -1}
     },
     {
        "$group": {
            "_id": "$post_id",
            "lastComment": {
                "$first": "$_id"
            }
        }
     }
])

我希望它返回整个评论的文档,但它只返回每个文档的_id字段。那么将所有最新评论作为整个文档(或至少包括其他一些领域)的正确方法是什么?

2 个答案:

答案 0 :(得分:16)

目前,您无法通过单个comment运算符获取整个$first文档。但您可以在_id步骤中包含其他必填字段(类似于$group字段):

{
    "$group": {
        _id: "$post_id",
        lastComment: { "$first": "$_id" },
        field_1: { "$first": "$field_1" },
        field_2: { "$first": "$field_2" },
        // ...
        field_N: { "$first": "$field_N" }
    }
}

根据此JIRA票证:https://jira.mongodb.org/browse/SERVER-5916,整个文档可从 2.5.3版本的聚合操作返回。可以使用新变量:$$ROOT$$CURRENT

{
    "$group": {
        _id: "$post_id",
        lastComment: { "$first": "$$CURRENT" }
    }
}

答案 1 :(得分:0)

根据建议,我们可以执行以下操作:

 {
    "$group": {
        _id: "$post_id",
        lastComment: { "$first": "$$CURRENT" }
    }
}

,然后在任何mongodb服务器3.4或更高版本上使用{'$ replaceRoot':{'newRoot':'$ lastComment'}}将对象从 {lastComment:{actualEntireObj}},{lastComment:{actualEntireObj}} 展开为 {},{} 这样,它将把嵌入式$$ ROOT文档移到顶层,并替换所有其他字段,例如从聚合的$ group阶段返回的 _id

    db.collection.aggregate([
    {
        "$match": {
            "post_id": {
                "$in": [ObjectId("52c5ce24dca32d32740c1435"), ObjectId("52c5ce24dca32d32740c15ad")]
            }
        }
    },
    {
        "$sort": { "_id": -1 }
    },
    {
        "$group": {
            _id: "$post_id",
            lastComment: { "$first": "$$CURRENT" }
        }
    },
    { '$replaceRoot': { 'newRoot': '$lastComment' } }
])