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.