Вы можете использовать $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
для последнего.