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.