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

Jak pobrać ostatni obiekt tablicy w osadzonym dokumencie w Mongoose?

Twój „najnowszy” dokument zawsze będzie znajdował się na końcu tablicy, chyba że w jakiś sposób go zmodyfikujesz. Dodawanie elementów do tablic zawsze prowadzi do "końca" lub "dołącza" do istniejących elementów, gdy jest używane z $push operator lub dodany za pomocą metod manipulacji tablicami w kodzie klienta.

Tylko operatory, takie jak $addToSet lub jawnie używając modyfikatorów do $push operacja to zmieni.

W związku z tym na końcu tablicy zwykle chcesz użyć $slice , z ujemnym indeksem, aby pobrać elementy z "końca" tablicy:

Model.findById("55d3a39565698bbc68079e31")
    .select({ "comments": { "$slice": -1 }})
    .exec(function(err,doc) {

    })

Jeśli faktycznie zmodyfikowałeś tablicę, jak wspomniano wcześniej, gdzie najnowsza data nie jest ostatnim elementem w tablicy, powinieneś użyć $sort modyfikator na aktualizacje. Generalnie byłoby „nie na miejscu” tylko wtedy, gdybyś poprosił o $position modyfikator lub użyłeś $addToSet . $position byłoby celowe i nie można również sortować, ale zawsze można posortować tablicę po $addToSet operacja taka jak ta, która porządkuje wszystkie daty bez zmiany jakiejkolwiek innej zawartości tablicy:

Model.findByIdAndUpdate("55d3a39565698bbc68079e31",
   { "$push": { "comments": { "$each": [], "$sort": { "date": 1 } } } }
)

Ze zmodyfikowaną tablicą ten sam $slice operacja dotyczy zapytań, ponieważ tablica jest teraz uporządkowana według daty.

Jeśli jednak Twoim zamiarem jest pozostawienie tablicy w dokumentach niesprawnej lub w innej kolejności, którą chcesz, ale chcesz również uzyskać najnowszą datę, możesz użyć .aggregate() do $sort i pobierz $last wpis tablicy:

Model.aggregate(
    [
        { "$match": { "_id": ObjectID("55d3a39565698bbc68079e31") } },
        { "$unwind": "$comments" },
        { "$sort": { "comments.date": 1 } },
        { "$group": {
            "_id": "$_id",
            "author": { "$first": "$author" },
            "link": { "$first": "$link" },
            "title": { "$first": "$title" },
            "date": { "$first": "$date" },
            "comments": { "$last": "$comments" }
        }}
    ]
)

Zauważając, że podczas korzystania z platformy agregacji z mangustą, _id "autocasting", który ma miejsce w innych zapytaniach, nie ma miejsca (jest to zgodne z projektem), więc konieczne jest rzutowanie na ObjectId oceń siebie, jeśli dane nie są jeszcze dostępne w tym formularzu i pojawiły się w postaci ciągu.

To są twoje sposoby na uzyskanie ostatniego elementu (opcjonalnie jawnie posortowanego) z tablicy.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Jak mogę określić naturalną kolejność w MongoDB?

  2. MongoDB Java Driver:MongoCore Driver vs. MongoDB Driver vs. MongoDB Async Driver

  3. Kolba mongoengine łączy się przez uri

  4. Przechowuj plik obrazu w danych binarnych w schemacie mangusty i wyświetlaj obraz w formie html

  5. Czy operacja upsert Mongoose aktualizuje/odnawia domyślne wartości schematu?