Можете да използвате или $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
за последно.