Du kan antingen använda $slice
db.groups.aggregate([
{ "$lookup": {
"from": "posts",
"localField": "_id",
"foreignField": "group",
"as": "post"
}},
{ "$addFields": {
"post": { "$slice": ["$post", -1] }
}}
])
Eller med MongoDB 3.6, returnera bara det sista inlägget med $lookup
i sin icke-korrelerade form:
db.groups.aggregate([
{ "$lookup": {
"from": "posts",
"as": "post",
"let": { "id": "$_id" },
"pipeline": [
{ "$match": {
"$expr": { "$eq": [ "$$id", "$group" ] }
}},
{ "$sort": { "_id": -1 } },
{ "$limit": 1 }
]
}}
])
Det senare är bättre eftersom du bara returnerar dokumentet från den utländska samlingen som du faktiskt vill ha.
Om du är säker på att du vill ha "singular" så $arrayElemAt
är utbytbar med $slice
i det initiala exemplet men returnerar det sista elementet istället för enbart det sista elementets array. Du kan också lägga till det i det andra formuläret för att bara ta ett element från pipelinen, som "alltid" är en array:
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 ] }
}}
])
Och på det sättet är det 0
index snarare än -1
till sist.