Du kan enten bruge $slice
db.groups.aggregate([
{ "$lookup": {
"from": "posts",
"localField": "_id",
"foreignField": "group",
"as": "post"
}},
{ "$addFields": {
"post": { "$slice": ["$post", -1] }
}}
])
Eller med MongoDB 3.6 skal du bare returnere det sidste indlæg ved hjælp af $lookup
i sin ikke-korrelerede form:
db.groups.aggregate([
{ "$lookup": {
"from": "posts",
"as": "post",
"let": { "id": "$_id" },
"pipeline": [
{ "$match": {
"$expr": { "$eq": [ "$$id", "$group" ] }
}},
{ "$sort": { "_id": -1 } },
{ "$limit": 1 }
]
}}
])
Det sidste er bedre, fordi du kun returnerer dokumentet fra den udenlandske samling, som du faktisk ønsker.
Hvis du er sikker på, at du vil have "ental", så $arrayElemAt
kan udskiftes med $slice
i det indledende eksempel, men returnerer det sidste element i stedet for kun det sidste elements array. Du kan også tilføje det til den anden form for blot at tage ét element fra pipelinen, som "altid" er en matrix:
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 ] }
}}
])
Og den vej rundt er det 0
indeks i stedet for -1
til sidst.