sql >> Databasteknik >  >> NoSQL >> MongoDB

Returnera det senaste dokumentet från en uppslagning

Du kan antingen använda $slice

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

Eller med MongoDB 3.6, returnera bara det sista inlägget med $lookup i sin icke-korrelerade form:

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

Det senare är bättre eftersom du bara returnerar dokumentet från den utländska samlingen som du faktiskt vill ha.

Om du är säker på att du vill ha "singular" så $arrayElemAt är utbytbar med $slice i det initiala exemplet men returnerar det sista elementet istället för enbart det sista elementets array. Du kan också lägga till det i det andra formuläret för att bara ta ett element från pipelinen, som "alltid" är en 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 ] }
   }}
])

Och på det sättet är det 0 index snarare än -1 till sist.




  1. Användningsfall för updateOne över findOneAndUpdate i MongoDB

  2. Single cache frontend och backend

  3. I NodeJS, hur matar man ut resultat från mongodb med olika fältnamn?

  4. VersionError:Inget matchande dokument hittades fel på Node.js/Mongoose