Você pode usar
$slice
db.groups.aggregate([
{ "$lookup": {
"from": "posts",
"localField": "_id",
"foreignField": "group",
"as": "post"
}},
{ "$addFields": {
"post": { "$slice": ["$post", -1] }
}}
])
Ou com o MongoDB 3.6, apenas retorne a última postagem usando
$lookup
em sua forma não correlacionada:db.groups.aggregate([
{ "$lookup": {
"from": "posts",
"as": "post",
"let": { "id": "$_id" },
"pipeline": [
{ "$match": {
"$expr": { "$eq": [ "$$id", "$group" ] }
}},
{ "$sort": { "_id": -1 } },
{ "$limit": 1 }
]
}}
])
O último é melhor porque você só devolve o documento da coleção estrangeira que realmente deseja.
Se você tem certeza de que quer "singular", então
$arrayElemAt
é intercambiável com $slice
no exemplo inicial, mas retorna o último elemento em vez da matriz apenas do último elemento. Você também pode adicioná-lo ao segundo formulário para pegar apenas um elemento do pipeline, que é "sempre" um 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 dessa forma é o
0
index em vez de -1
por último.