Můžete použít buď $slice
db.groups.aggregate([
{ "$lookup": {
"from": "posts",
"localField": "_id",
"foreignField": "group",
"as": "post"
}},
{ "$addFields": {
"post": { "$slice": ["$post", -1] }
}}
])
Nebo s MongoDB 3.6 stačí vrátit poslední příspěvek pomocí $lookup
v nekorelované podobě:
db.groups.aggregate([
{ "$lookup": {
"from": "posts",
"as": "post",
"let": { "id": "$_id" },
"pipeline": [
{ "$match": {
"$expr": { "$eq": [ "$$id", "$group" ] }
}},
{ "$sort": { "_id": -1 } },
{ "$limit": 1 }
]
}}
])
To druhé je lepší, protože vrátíte pouze dokument ze zahraniční sbírky, který skutečně chcete.
Pokud jste si jisti, že chcete "singulární", pak $arrayElemAt
je zaměnitelné s $slice
v počátečním příkladu, ale vrátí poslední prvek namísto pole pouze posledního prvku. Můžete jej také přidat do druhého formuláře a vzít pouze jeden prvek z potrubí, což je „vždy“ pole:
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 ] }
}}
])
A takto je to 0
index spíše než -1
naposledy.