您可以使用$slice
db.groups.aggregate([
{ "$lookup": {
"from": "posts",
"localField": "_id",
"foreignField": "group",
"as": "post"
}},
{ "$addFields": {
"post": { "$slice": ["$post", -1] }
}}
])
或者使用 MongoDB 3.6,只需使用 $lookup 以非相关形式返回最后一个帖子:
db.groups.aggregate([
{ "$lookup": {
"from": "posts",
"as": "post",
"let": { "id": "$_id" },
"pipeline": [
{ "$match": {
"$expr": { "$eq": [ "$$id", "$group" ] }
}},
{ "$sort": { "_id": -1 } },
{ "$limit": 1 }
]
}}
])
后者更好,因为您只返回您真正想要的外部集合中的文档。
如果您确定要“单数”,则$arrayElemAt 可以与初始示例中的$slice 互换,但返回最后一个元素而不是仅返回最后一个元素的数组。您还可以将其添加到第二种形式中,以仅从管道中获取一个元素,该元素“始终”是一个数组:
db.groups.aggregate([
{ "$lookup": {
"from": "posts",
"as": "post",
"let": { "id": "$_id" },
"pipeline": [
{ "$match": {
"$expr": { "$eq": [ "$$id", "$group" ] }
}},
{ "$sort": { "_id": -1 } },
{ "$limit": 1 }
]
}},
{ "$addFields": {
"post": { "$arrayElemAt": [ "$post", 0 ] }
}}
])
这样就可以使用0 索引,而不是最后的-1。