sql >> Base de Datos >  >> NoSQL >> MongoDB

Devolver el último documento de una búsqueda

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.