Je kunt ofwel $slice
. gebruiken
db.groups.aggregate([
{ "$lookup": {
"from": "posts",
"localField": "_id",
"foreignField": "group",
"as": "post"
}},
{ "$addFields": {
"post": { "$slice": ["$post", -1] }
}}
])
Of met MongoDB 3.6, retourneer gewoon het laatste bericht met $lookup
in zijn niet-gecorreleerde vorm:
db.groups.aggregate([
{ "$lookup": {
"from": "posts",
"as": "post",
"let": { "id": "$_id" },
"pipeline": [
{ "$match": {
"$expr": { "$eq": [ "$$id", "$group" ] }
}},
{ "$sort": { "_id": -1 } },
{ "$limit": 1 }
]
}}
])
Dat laatste is beter omdat je alleen het document terugstuurt uit de buitenlandse collectie die je echt wilt hebben.
Als je zeker weet dat je "enkelvoud" wilt, dan $arrayElemAt
is uitwisselbaar met $slice
in het eerste voorbeeld, maar retourneert alleen het laatste element in plaats van de array van het laatste element. Je kunt het ook toevoegen aan het tweede formulier om slechts één element uit de pijplijn te nemen, wat "altijd" een array is:
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 ] }
}}
])
En op die manier is het de 0
index in plaats van -1
voor het laatst.