Votre "dernier" document sera toujours à la fin de votre tableau à moins que vous ne le modifiiez d'une manière ou d'une autre. L'ajout d'éléments dans des tableaux ira toujours à la "fin" ou à "l'ajout" des éléments existants lorsqu'il est utilisé avec le $push
opérateur ou ajouté à l'aide de méthodes de manipulation de tableaux dans le code client.
Seuls les opérateurs comme $addToSet
ou en utilisant explicitement des modificateurs pour le $push
l'opération changera cela.
En tant que tel, à la fin d'un tableau, ce que vous voulez généralement faire est d'utiliser $slice
, avec un index négatif pour obtenir les éléments de la "fin" du tableau :
Model.findById("55d3a39565698bbc68079e31")
.select({ "comments": { "$slice": -1 }})
.exec(function(err,doc) {
})
Si vous avez réellement modifié le tableau comme mentionné précédemment où la dernière date n'est pas le dernier élément du tableau, vous devriez utiliser le $sort
modificateur sur les mises à jour. Ce ne serait généralement "hors de propos" que si vous demandiez la $position
modificateur ou vous avez utilisé $addToSet
. La $position
serait délibéré et vous ne pouvez pas également trier, mais vous pouvez toujours trier le tableau après un $addToSet
opération comme celle-ci, qui place toutes les dates dans l'ordre sans changer aucun autre contenu du tableau :
Model.findByIdAndUpdate("55d3a39565698bbc68079e31",
{ "$push": { "comments": { "$each": [], "$sort": { "date": 1 } } } }
)
Avec le tableau modifié, le même $slice
l'opération s'applique aux requêtes car le tableau est maintenant trié par date.
Si toutefois votre intention est de laisser le tableau dans vos documents dans le désordre, ou dans l'autre ordre que vous souhaitez, mais que vous souhaitez également obtenir la dernière date, vous pouvez utiliser .aggregate()
à $sort
et récupérez le $last
entrée de tableau :
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" }
}}
]
)
Notant que lors de l'utilisation du framework d'agrégation avec mongoose, le _id
"l'autocasting" qui se produit dans d'autres requêtes ne se produit pas (c'est par conception), il est donc nécessaire de convertir en un ObjectId
évaluez-vous, si les données ne sont pas déjà disponibles sous cette forme et sont arrivées sous forme de chaîne.
Ce sont vos façons d'obtenir le dernier élément (éventuellement trié explicitement) d'un tableau.