Вашият "последен" документ винаги ще бъде в края на вашия масив, освен ако не промените по някакъв начин. Добавянето на елементи в масиви винаги ще отива в „края“ или „добавя“ към съществуващите елементи, когато се използва с $push
оператор или добавен с помощта на методи за манипулиране на масиви в клиентския код.
Само оператори като $addToSet
или изрично използване на модификатори към $push
операция ще промени това.
Като такъв, когато сте в края на масив, това, което обикновено искате да направите, е да използвате $slice
, с отрицателен индекс, за да получите елементи от „края“ на масива:
Model.findById("55d3a39565698bbc68079e31")
.select({ "comments": { "$slice": -1 }})
.exec(function(err,doc) {
})
Ако действително сте модифицирали масива, както беше споменато по-рано, където последната дата не е последният елемент в масива, тогава трябва да използвате $sort
модификатор на актуализации. Като цяло би било „не на място“ само ако поискате $position
модификатор или сте използвали $addToSet
. $position
би било умишлено и не можете също да сортирате, но винаги можете да сортирате масива след $addToSet
операция като тази, която подрежда всички дати, без да променя друго съдържание на масива:
Model.findByIdAndUpdate("55d3a39565698bbc68079e31",
{ "$push": { "comments": { "$each": [], "$sort": { "date": 1 } } } }
)
С модифицирания масив същия $slice
операцията се прилага за заявки, тъй като масивът вече е подреден по дата.
Ако обаче вашето намерение е да оставите масива в документите си в нередовен ред или в друг ред, който желаете, но също така искате да получите най-новата дата, тогава можете да използвате .aggregate()
до $sort
и извлечете $last
запис в масив:
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" }
}}
]
)
Отбелязвайки, че когато използвате рамката за агрегиране с mongoose, _id
"автоматично предаване", което се случва в други заявки, не се случва (това е по проект), така че е необходимо да се прехвърля към ObjectId
оценявайте себе си, ако данните вече не са налични в тази форма и са дошли като низ.
Това са вашите начини да получите последния елемент (опционално изрично сортиран) от масив.