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.


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) {...

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.