我正在使用以下查询来获取数据库中每个帖子的最新评论:
db.comments.aggregate([
{
"$match": {
"post_id": {
"$in": [ObjectId("52c5ce24dca32d32740c1435"), ObjectId("52c5ce24dca32d32740c15ad")]
}
}
},
{
"$sort": {"_id": -1}
},
{
"$group": {
"_id": "$post_id",
"lastComment": {
"$first": "$_id"
}
}
}
])
我希望它返回整个评论的文档,但它只返回每个文档的_id
字段。那么将所有最新评论作为整个文档(或至少包括其他一些领域)的正确方法是什么?
答案 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' } }
])