sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Cómo recuperar el último objeto de una matriz en un documento incrustado en Mongoose?

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.