MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Restituire l'ultimo documento da una ricerca

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.