Váš „nejnovější“ dokument bude vždy na konci vašeho pole, pokud jej nějak neupravíte. Přidávání položek do polí bude vždy přejít na „konec“ nebo „připojit“ ke stávajícím položkám, pokud se použije s $push
operátor nebo přidány pomocí metod manipulace s polem v kódu klienta.
Pouze operátoři jako $addToSet
nebo explicitně pomocí modifikátorů pro $push
operace to změní.
Když jste na konci pole, obvykle chcete použít $slice
, se záporným indexem pro získání položek z "konce" pole:
Model.findById("55d3a39565698bbc68079e31")
.select({ "comments": { "$slice": -1 }})
.exec(function(err,doc) {
})
Pokud jste pole skutečně upravili, jak bylo zmíněno dříve, kde nejnovější datum není posledním prvkem v poli, měli byste použít $sort
modifikátor aktualizací. Obecně by to bylo "nemístné", pokud byste požádali o $position
modifikátor nebo jste použili $addToSet
. $position
by bylo záměrné a nemůžete také třídit, ale vždy můžete pole seřadit po $addToSet
operace, jako je tato, která umístí všechna data do pořadí, aniž by se změnil jakýkoli další obsah pole:
Model.findByIdAndUpdate("55d3a39565698bbc68079e31",
{ "$push": { "comments": { "$each": [], "$sort": { "date": 1 } } } }
)
S upraveným polem stejný $slice
operace se vztahuje na dotazy, protože pole je nyní v pořadí podle data.
Pokud je však vaším záměrem ponechat pole ve vašich dokumentech mimo pořadí nebo v jiném požadovaném pořadí, ale chcete také získat nejnovější datum, můžete použít .aggregate()
na $sort
a načtěte $last
položka pole:
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" }
}}
]
)
Upozorňujeme, že při použití agregačního rámce s mongoose je _id
"autocasting", ke kterému dochází v jiných dotazech, neprobíhá (toto je záměrné), takže je nutné přetypovat na ObjectId
value sami, pokud data ještě nejsou k dispozici v této podobě a přišla jako řetězec.
To jsou vaše způsoby, jak získat poslední prvek (volitelně explicitně seřazený) z pole.