Mongoose findByIdAndUpdate ne renvoie pas le modèle correct


98

J'ai un problème que je n'ai jamais vu auparavant avec le FindByIdAndUpdate de Mongoose qui ne renvoie pas le bon modèle dans le rappel.

Voici le code:

    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);
    });

Le document original dans la base de données ressemble à ceci:

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

Le updateObj entrant ressemble à ceci:

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

Le modèle renvoyé par le rappel est identique au modèle d'origine, pas à updatedObj. Si j'interroge la base de données, elle a été mise à jour correctement. Il n'est tout simplement pas renvoyé de la base de données.

Cela ressemble à une erreur "utilisateur stupide", mais je ne peux pas le voir. Toutes les idées sont grandement appréciées.


1
C'est un endroit génial. Et un rappel pourquoi je dois garder tous mes projets correspondants sur les versions, car ce package passait ses propres tests unitaires. Je vous remercie.
JonRed

Réponses:


294

Dans Mongoose 4.0, la valeur par défaut de l' newoption de findByIdAndUpdate(et findOneAndUpdate) est devenue false(voir # 2262 des notes de publication ). Cela signifie que vous devez définir explicitement l'option sur truepour obtenir la nouvelle version du document, une fois la mise à jour appliquée:

Model.findByIdAndUpdate(id, updateObj, {new: true}, function(err, model) {...

5
J'ai également été surpris par les modifications apportées aux valeurs de retour de la méthode 'create'. Salut mon pote, je voterais deux fois si je pouvais.
JonRed

4
Mettez également dans un PR pour les documents mis à jour sur le projet mangouste, donc j'espère que cela n'attrapera personne d'autre.
JonRed

3
Oh mon garçon, merci @JohnnyHK. Cela m'a détruit. Bien sûr, je veux récupérer le nouveau. Plus cohérent avec l'API peut-être, mais pas vraiment avec le bon sens ... si je mets à jour quelque chose, j'aimerais voir les changements. Merci
mongoose

21
Hou la la! Quelle horrible décision ils ont prise! C'est le seul point de faire la recherche en premier lieu au lieu de la mise à jour.
Adam Lockhart

9
Je ne comprends pas pourquoi quelqu'un préfère avoir l'ancien document dans la réponse au lieu du nouveau
emilioriosvz
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.