Ditt "senaste" dokument kommer alltid att finnas i slutet av din array om du inte ändrar på något sätt. Att lägga till objekt i arrayer kommer alltid att gå till "slutet" eller "lägga till" till de befintliga objekten när det används med $push
operatör eller tillagd med arraymanipulationsmetoder i klientkod.
Endast operatörer som $addToSet
eller uttryckligen använda modifierare till $push
operation kommer att ändra detta.
Som sådan, när du är i slutet av en array, vad du vanligtvis vill göra är att använda $slice
, med ett negativt index för att hämta objekt från "änden" av arrayen:
Model.findById("55d3a39565698bbc68079e31")
.select({ "comments": { "$slice": -1 }})
.exec(function(err,doc) {
})
Om du faktiskt har modifierat arrayen som tidigare nämnts där det senaste datumet inte är det sista elementet i arrayen bör du använda $sort
modifierare på uppdateringar. Det skulle i allmänhet bara vara "malplacerat" om du bad om $position
modifierare eller så använde du $addToSet
. $position
skulle vara avsiktligt och du kan inte också sortera, men du kan alltid sortera arrayen efter en $addToSet
operation som denna, som placerar alla datum i ordning utan att ändra något annat innehåll i arrayen:
Model.findByIdAndUpdate("55d3a39565698bbc68079e31",
{ "$push": { "comments": { "$each": [], "$sort": { "date": 1 } } } }
)
Med arrayen modifierad samma $slice
operationen gäller för frågor eftersom arrayen nu är i ordning efter datum.
Om din avsikt är att lämna arrayen i dina dokument ur funktion, eller i den ordning du vill ha, men du också vill få det senaste datumet, kan du använda .aggregate()
till $sort
och hämta $last
arraypost:
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" }
}}
]
)
Notera att när du använder aggregeringsramverket med mongoose, _id
"autocasting" som sker i andra frågor sker inte (detta är designat), så det är nödvändigt att casta till ett ObjectId
värdera dig själv, om data inte redan är tillgänglig i den formen och har kommit in som en sträng.
Det är dina sätt att få det sista elementet (valfritt explicit sorterat) från en array.