Ihr "neuestes" Dokument befindet sich immer am Ende Ihres Arrays, es sei denn, Sie ändern es irgendwie. Das Hinzufügen von Elementen zu Arrays geht immer an das „Ende“ oder „Anhängen“ an die vorhandenen Elemente, wenn es mit dem $push
-Operator oder mithilfe von Array-Manipulationsmethoden im Client-Code hinzugefügt.
Nur Operatoren wie $addToSet
oder explizit Modifikatoren für $push
verwenden Betrieb wird dies ändern.
Daher sollten Sie am Ende eines Arrays normalerweise $slice
, mit einem negativen Index, um Elemente vom "Ende" des Arrays abzurufen:
Model.findById("55d3a39565698bbc68079e31")
.select({ "comments": { "$slice": -1 }})
.exec(function(err,doc) {
})
Wenn Sie das Array tatsächlich wie zuvor erwähnt geändert haben, wobei das späteste Datum nicht das letzte Element im Array ist, sollten Sie den $sort
Modifikator bei Updates. Es wäre im Allgemeinen nur "fehl am Platz", wenn Sie nach der $position
fragen würden Modifikator oder Sie haben $addToSet
verwendet . Die $position
wäre absichtlich und Sie können nicht auch sortieren, aber Sie können das Array immer nach einem $addToSet
sortieren Operation wie diese, die alle Daten in eine Reihenfolge bringt, ohne den anderen Inhalt des Arrays zu ändern:
Model.findByIdAndUpdate("55d3a39565698bbc68079e31",
{ "$push": { "comments": { "$each": [], "$sort": { "date": 1 } } } }
)
Mit dem modifizierten Array dasselbe $slice
Der Vorgang gilt für Abfragen, da das Array jetzt nach Datum geordnet ist.
Wenn Sie jedoch beabsichtigen, das Array in Ihren Dokumenten in der falschen Reihenfolge oder in der anderen gewünschten Reihenfolge zu belassen, aber auch das neueste Datum erhalten möchten, können Sie .aggregate()
zu $sort
und rufen Sie $last
ab
Array-Eintrag:
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" }
}}
]
)
Beachten Sie, dass bei Verwendung des Aggregationsframeworks mit Mongoose die _id
"Autocasting", das in anderen Abfragen auftritt, findet nicht statt (das ist beabsichtigt), daher ist es notwendig, in eine ObjectId
zu konvertieren schätzen, wenn die Daten nicht schon in dieser Form vorliegen und als String reingekommen sind.
Das sind Ihre Möglichkeiten, um das letzte Element ( optional explizit sortiert ) aus einem Array zu erhalten.