Możesz użyć $slice
db.groups.aggregate([
{ "$lookup": {
"from": "posts",
"localField": "_id",
"foreignField": "group",
"as": "post"
}},
{ "$addFields": {
"post": { "$slice": ["$post", -1] }
}}
])
Lub z MongoDB 3.6, po prostu zwróć ostatni post za pomocą $lookup
w formie nieskorelowanej:
db.groups.aggregate([
{ "$lookup": {
"from": "posts",
"as": "post",
"let": { "id": "$_id" },
"pipeline": [
{ "$match": {
"$expr": { "$eq": [ "$$id", "$group" ] }
}},
{ "$sort": { "_id": -1 } },
{ "$limit": 1 }
]
}}
])
To drugie jest lepsze, ponieważ zwracasz tylko dokument z kolekcji zagranicznej, który faktycznie chcesz.
Jeśli jesteś pewien, że chcesz „pojedyncze”, to $arrayElemAt
jest wymienny z $slice
w początkowym przykładzie, ale zwraca ostatni element zamiast tablicy tylko ostatniego elementu. Możesz również dodać go do drugiego formularza, aby pobrać tylko jeden element z potoku, który jest "zawsze" tablicą:
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 ] }
}}
])
I w ten sposób jest to 0
indeks zamiast -1
na koniec.