Dit "seneste" dokument vil altid være i slutningen af dit array, medmindre du på en eller anden måde ændrer. Tilføjelse af elementer i arrays vil altid gå til "enden" eller "tilføje" til de eksisterende elementer, når det bruges med $push
operator eller tilføjet ved hjælp af array-manipulationsmetoder i klientkode.
Kun operatører som $addToSet
eller eksplicit ved at bruge modifikatorer til $push
operation vil ændre dette.
Som sådan, når du er i slutningen af et array, er det, du typisk vil gøre, at bruge $slice
, med et negativt indeks for at hente elementer fra "enden" af arrayet:
Model.findById("55d3a39565698bbc68079e31")
.select({ "comments": { "$slice": -1 }})
.exec(function(err,doc) {
})
Hvis du faktisk har ændret arrayet som nævnt tidligere, hvor den seneste dato ikke er det sidste element i arrayet, bør du bruge $sort
modifikator på opdateringer. Det ville generelt kun være "malplaceret", hvis du bad om $position
modifier eller du brugte $addToSet
. $position
ville være bevidst, og du kan ikke også sortere, men du kan altid sortere arrayet efter en $addToSet
operation som denne, som placerer alle datoerne i rækkefølge uden at ændre noget andet indhold i arrayet:
Model.findByIdAndUpdate("55d3a39565698bbc68079e31",
{ "$push": { "comments": { "$each": [], "$sort": { "date": 1 } } } }
)
Med arrayet ændret den samme $slice
operationen gælder for forespørgsler, da arrayet nu er i rækkefølge efter dato.
Hvis din hensigt er at lade arrayet i dine dokumenter være ude af rækkefølge, eller i den anden rækkefølge, du ønsker, men du også ønsker at få den seneste dato, så kan du bruge .aggregate()
til $sort
og hent $last
matrixindgang:
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" }
}}
]
)
Bemærk, at når du bruger aggregeringsrammen med mongoose, er _id
"autocasting", der sker i andre forespørgsler, sker ikke ( dette er af design ), så det er nødvendigt at caste til et ObjectId
værdi dig selv, hvis dataene ikke allerede er tilgængelige i den form og er kommet ind som en streng.
Det er dine måder at få det sidste element (eventuelt eksplicit sorteret) fra et array.