Su documento "más reciente" siempre estará al final de su matriz a menos que lo modifique de alguna manera. Agregar elementos a matrices siempre irá al "final" o "agregará" a los elementos existentes cuando se usa con $push
operador o agregado usando métodos de manipulación de matrices en el código del cliente.
Solo operadores como $addToSet
o usando explícitamente modificadores del $push
la operación cambiará esto.
Como tal, cuando está al final de una matriz, lo que normalmente desea hacer es usar $slice
, con un índice negativo para obtener elementos del "final" de la matriz:
Model.findById("55d3a39565698bbc68079e31")
.select({ "comments": { "$slice": -1 }})
.exec(function(err,doc) {
})
Si realmente ha modificado la matriz como se mencionó anteriormente, donde la fecha más reciente no es el último elemento de la matriz, entonces debería usar $sort
modificador de actualizaciones. Por lo general, solo estaría "fuera de lugar" si solicita la $position
modificador o usó $addToSet
. La $position
sería deliberado y tampoco puede ordenar, pero siempre puede ordenar la matriz después de un $addToSet
operación como esta, que coloca todas las fechas en orden sin cambiar ningún otro contenido de la matriz:
Model.findByIdAndUpdate("55d3a39565698bbc68079e31",
{ "$push": { "comments": { "$each": [], "$sort": { "date": 1 } } } }
)
Con la matriz modificada, el mismo $slice
la operación se aplica a las consultas ya que la matriz ahora está ordenada por fecha.
Sin embargo, si su intención es dejar la matriz en sus documentos fuera de orden, o en el otro orden que desee, pero también desea obtener la fecha más reciente, entonces puede usar .aggregate()
a $sort
y recuperar el $last
entrada de matriz:
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" }
}}
]
)
Teniendo en cuenta que cuando se usa el marco de agregación con mongoose, el _id
"autocasting" que ocurre en otras consultas no ocurre (esto es por diseño), por lo que es necesario convertir a un ObjectId
valórese, si los datos no están ya disponibles en ese formulario y se han introducido como una cadena.
Esas son sus formas de obtener el último elemento (opcionalmente ordenado explícitamente) de una matriz.