MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como recuperar o último objeto de uma matriz em um documento incorporado no Mongoose?


Seu documento "mais recente" sempre estará no final de sua matriz, a menos que você modifique de alguma forma. Adicionar itens em matrizes sempre irá para o "final" ou "anexar" aos itens existentes quando usado com o $push operador ou adicionado usando métodos de manipulação de matriz no código do cliente.

Somente operadores como $addToSet ou explicitamente usando modificadores para o $push operação mudará isso.

Assim, quando no final de uma matriz, o que você normalmente deseja fazer é usar $slice , com um índice negativo para obter itens do "final" do array:
Model.findById("55d3a39565698bbc68079e31")
    .select({ "comments": { "$slice": -1 }})
    .exec(function(err,doc) {

    })

Se você realmente modificou a matriz como mencionado anteriormente, onde a data mais recente não é o último elemento da matriz, você deve usar o $sort modificador nas atualizações. Geralmente só estaria "fora de lugar" se você pedisse o $position modificador ou você usou $addToSet . A $position seria deliberado e você também não pode classificar, mas sempre pode classificar a matriz após um $addToSet operação como esta, que coloca todas as datas em ordem sem alterar nenhum outro conteúdo do array:
Model.findByIdAndUpdate("55d3a39565698bbc68079e31",
   { "$push": { "comments": { "$each": [], "$sort": { "date": 1 } } } }
)

Com o array modificado o mesmo $slice A operação se aplica a consultas, pois a matriz agora está na ordem por data.

Se, no entanto, sua intenção é deixar a matriz em seus documentos fora de ordem, ou na outra ordem desejada, mas também deseja obter a data mais recente, use .aggregate() para $sort e recupere o $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" }
        }}
    ]
)

Observando que ao usar o framework de agregação com mangusto, o _id "autocasting" que acontece em outras consultas não acontece (isso é por design), então é necessário converter para um ObjectId valor a si mesmo, se os dados ainda não estiverem disponíveis nesse formulário e vierem como uma string.

Essas são suas maneiras de obter o último elemento (opcionalmente classificado explicitamente) de uma matriz.