MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Gibt das letzte Dokument aus einer Suche zurück

Sie können entweder $slice verwenden

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

Oder geben Sie mit MongoDB 3.6 einfach den letzten Beitrag mit $lookup zurück in seiner nicht korrelierten Form:

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

Letzteres ist besser, weil Sie nur das Dokument aus der ausländischen Sammlung zurücksenden, das Sie tatsächlich wollen.

Wenn Sie sicher sind, dass Sie "Singular" wollen, dann $arrayElemAt ist austauschbar mit $slice im ersten Beispiel, gibt aber nur das letzte Element anstelle des Arrays des letzten Elements zurück. Sie können es auch zum zweiten Formular hinzufügen, um nur ein Element aus der Pipeline zu nehmen, das "immer" ein Array ist:

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

Und so herum ist es die 0 index statt -1 zum Schluss.