Mongoose findByIdAndUpdate não retorna o modelo correto

98

Eu tenho um problema que não vi antes com o Mongoose findByIdAndUpdate não retornar o modelo correto no retorno de chamada.

Aqui está o código:

    var id = args._id;
    var updateObj = {updatedDate: Date.now()};
    _.extend(updateObj, args);

    Model.findByIdAndUpdate(id, updateObj, function(err, model) {
        if (err) {
            logger.error(modelString +':edit' + modelString +' - ' + err.message);
            self.emit('item:failure', 'Failed to edit ' + modelString);
            return;
        }
        self.emit('item:success', model);
    });

O documento original no banco de dados tem a seguinte aparência:

{
    _id: 1234
    descriptors: Array[2],
    name: 'Test Name 1'
}

O updateObj que vai entrar se parece com este:

{
    _id: 1234
    descriptors: Array[2],
    name: 'Test Name 2'
}  

O modelo retornado do retorno de chamada é idêntico ao modelo original, não o updatedObj. Se eu consultar o banco de dados, ele foi atualizado corretamente. Apenas não está sendo retornado do banco de dados.

Parece um erro de 'usuário estúpido', mas não consigo ver. Quaisquer ideias muito apreciadas.

JonRed
fonte
1
Esse é um local incrível. E um lembrete do porque eu preciso manter todos os meus projetos correspondentes nas versões, já que o pacote estava passando em seus próprios testes de unidade. Obrigado.
JonRed

Respostas:

292

No Mongoose 4.0, o valor padrão para a newopção de findByIdAndUpdate(e findOneAndUpdate) mudou para false(consulte # 2262 das notas de lançamento ). Isso significa que você precisa definir explicitamente a opção para trueobter a nova versão do documento, após a atualização ser aplicada:

Model.findByIdAndUpdate(id, updateObj, {new: true}, function(err, model) {...
JohnnyHK
fonte
4
Também foi pego pelas mudanças nos valores de retorno do método 'criar'. Saúde amigo, votaria a favor duas vezes se pudesse.
JonRed
4
Também coloque um PR para documentos atualizados sobre o projeto mongoose, então espero que não pegue ninguém mais.
JonRed
3
Nossa, obrigado @JohnnyHK. Isso me destruiu. Claro que quero o novo de volta. Mais consistente com a API talvez, mas não realmente com o bom senso ... se eu atualizar algo, gostaria de ver as mudanças. Obrigado mangusto ...
Peege151
20
Uau! Que decisão horrível eles tomaram! Esse é o único ponto de fazer a localização em primeiro lugar, em vez de atualizar.
Adam Lockhart
9
Não entendo por que alguém prefere ter o documento antigo na resposta em vez do novo
emilioriosvz