MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Retornar o último documento de uma pesquisa


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.