Puedes usar $slice
db.groups.aggregate([
{ "$lookup": {
"from": "posts",
"localField": "_id",
"foreignField": "group",
"as": "post"
}},
{ "$addFields": {
"post": { "$slice": ["$post", -1] }
}}
])
O con MongoDB 3.6, simplemente devuelva la última publicación usando $lookup
en su forma no correlacionada:
db.groups.aggregate([
{ "$lookup": {
"from": "posts",
"as": "post",
"let": { "id": "$_id" },
"pipeline": [
{ "$match": {
"$expr": { "$eq": [ "$$id", "$group" ] }
}},
{ "$sort": { "_id": -1 } },
{ "$limit": 1 }
]
}}
])
Esto último es mejor porque solo devuelves el documento de la colección extranjera que realmente quieres.
Si está seguro de que quiere "singular", entonces $arrayElemAt
es intercambiable con $slice
en el ejemplo inicial, pero devuelve el último elemento en lugar de la matriz del último elemento solamente. También puede agregarlo al segundo formulario para tomar solo un elemento de la canalización, que "siempre" es una matriz:
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 ] }
}}
])
Y de esa manera es el 0
índice en lugar de -1
para el final.