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

Returner det sidste dokument fra et opslag

Du kan enten bruge $slice

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

Eller med MongoDB 3.6 skal du bare returnere det sidste indlæg ved hjælp af $lookup i sin ikke-korrelerede form:

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

Det sidste er bedre, fordi du kun returnerer dokumentet fra den udenlandske samling, som du faktisk ønsker.

Hvis du er sikker på, at du vil have "ental", så $arrayElemAt kan udskiftes med $slice i det indledende eksempel, men returnerer det sidste element i stedet for kun det sidste elements array. Du kan også tilføje det til den anden form for blot at tage ét element fra pipelinen, som "altid" er en matrix:

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

Og den vej rundt er det 0 indeks i stedet for -1 til sidst.




  1. MongoDB:output 'id' i stedet for '_id'

  2. 2 måder at erstatte en understreng i MongoDB

  3. Stackexchange.redis mangler WAIT-understøttelsen

  4. Hvordan konverterer man en eksisterende relationsdatabase til et nøgleværdilager?