MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Zwróć ostatni dokument z odnośnika

Możesz użyć $slice

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

Lub z MongoDB 3.6, po prostu zwróć ostatni post za pomocą $lookup w formie nieskorelowanej:

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

To drugie jest lepsze, ponieważ zwracasz tylko dokument z kolekcji zagranicznej, który faktycznie chcesz.

Jeśli jesteś pewien, że chcesz „pojedyncze”, to $arrayElemAt jest wymienny z $slice w początkowym przykładzie, ale zwraca ostatni element zamiast tablicy tylko ostatniego elementu. Możesz również dodać go do drugiego formularza, aby pobrać tylko jeden element z potoku, który jest "zawsze" tablicą:

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

I w ten sposób jest to 0 indeks zamiast -1 na koniec.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Dostęp do MongoDB z Go

  2. Czy należy włączyć księgowanie MongoDB?

  3. id kursora mongodb niepoprawny błąd

  4. Wykryj, czy wartość zawiera co najmniej jedną cyfrę w SQL

  5. MongoDB Java Inserting Throws org.bson.codecs.configuration.CodecConfigurationException:Nie można znaleźć kodeka dla klasy io.github.ilkgunel.mongodb.Pojo