MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Renvoyer le dernier document à partir d'une recherche

Vous pouvez soit utiliser $slice

db.groups.aggregate([
   { "$lookup": {
     "from": "posts",
     "localField": "_id",
     "foreignField": "group",
     "as": "post"
   }},
   { "$addFields": {
     "post": { "$slice": ["$post", -1] }
   }}
])

Ou avec MongoDB 3.6, renvoyez simplement le dernier message en utilisant $lookup sous sa forme non corrélée :

db.groups.aggregate([
   { "$lookup": {
     "from": "posts",
     "as": "post",
     "let": { "id": "$_id" },
     "pipeline": [
       { "$match": { 
          "$expr": { "$eq": [ "$$id", "$group" ] }
       }},
       { "$sort": { "_id": -1 } },
       { "$limit": 1 }
     ]
   }}
])

Ce dernier est préférable car vous ne restituez que le document de la collection étrangère que vous souhaitez réellement.

Si vous êtes certain de vouloir "singulier", alors $arrayElemAt est interchangeable avec $slice dans l'exemple initial mais renvoie le dernier élément au lieu du tableau du dernier élément uniquement. Vous pouvez également l'ajouter au deuxième formulaire pour ne prendre qu'un élément du pipeline, qui est "toujours" un tableau :

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 ] }
   }}
])

Et de cette façon c'est le 0 index plutôt que -1 pour la fin.