Puoi usare $slice
db.groups.aggregate([
{ "$lookup": {
"from": "posts",
"localField": "_id",
"foreignField": "group",
"as": "post"
}},
{ "$addFields": {
"post": { "$slice": ["$post", -1] }
}}
])
O con MongoDB 3.6, restituisci l'ultimo post usando $lookup
nella sua forma non correlata:
db.groups.aggregate([
{ "$lookup": {
"from": "posts",
"as": "post",
"let": { "id": "$_id" },
"pipeline": [
{ "$match": {
"$expr": { "$eq": [ "$$id", "$group" ] }
}},
{ "$sort": { "_id": -1 } },
{ "$limit": 1 }
]
}}
])
Quest'ultimo è meglio perché restituisci solo il documento della collezione estera che desideri effettivamente.
Se sei certo di volere "singolare", allora $arrayElemAt
è intercambiabile con $slice
nell'esempio iniziale, ma restituisce l'ultimo elemento invece dell'array dell'ultimo elemento. Puoi anche aggiungerlo al secondo modulo per prendere solo un elemento dalla pipeline, che è "sempre" un 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 ] }
}}
])
E in questo modo è il 0
index anziché -1
per ultimo.