sql >> Database >  >> NoSQL >> MongoDB

Retourneer het laatste document van een zoekopdracht

Je kunt ofwel $slice . gebruiken

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

Of met MongoDB 3.6, retourneer gewoon het laatste bericht met $lookup in zijn niet-gecorreleerde vorm:

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

Dat laatste is beter omdat je alleen het document terugstuurt uit de buitenlandse collectie die je echt wilt hebben.

Als je zeker weet dat je "enkelvoud" wilt, dan $arrayElemAt is uitwisselbaar met $slice in het eerste voorbeeld, maar retourneert alleen het laatste element in plaats van de array van het laatste element. Je kunt het ook toevoegen aan het tweede formulier om slechts één element uit de pijplijn te nemen, wat "altijd" een array is:

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

En op die manier is het de 0 index in plaats van -1 voor het laatst.




  1. Hoe voeg ik een element toe aan de interne lijst van MongoDB?

  2. MongoDB deleteOne()

  3. Redis aangepaste opdrachten

  4. Zoeken op meerdere collecties in MongoDB