web-dev-qa-db-fra.com

Mongoose findOneAndUpdate et upsert ne renvoient aucune erreur, aucun document affecté

J'ai un modèle très minimal:

var CompanySchema = new mongoose.Schema({
    name: { type: String, required: true, unique: true },
});

var Company = mongoose.model('Company', CompanySchema)

J'essaie d'ajouter un seul document s'il n'existe pas. Actuellement, il n'y a aucun document pendant que je teste:

models.Company.findOneAndUpdate({
    name: 'companyName'
}, {upsert: true}, function(err, numberAffected, raw){
    console.log(err, numberAffected, raw)
})

Ceci utilise les options upsert des documents Mongoose

Cependant err est null, numberAffected est nul. Pourquoi mon document n'est-il pas mis à jour?

21
mikemaccana

dans votre code, vous utilisez la version à 3 paramètres de la méthode findOneAndUpdate donc, selon la documentation que vous avez publiée, les paramètres sont: A.findOneAndUpdate(conditions, update, callback).

Vous devez utiliser la version 4e paramètres de la méthode pour spécifier l'option upsert.

Je tiens à souligner que je n'ai jamais utilisé le cadre mangouste. J'espère que cela t'aides.

Edit: Oui, dans votre cas, conditions et update sont les mêmes. Si votre objet est plus complexe que celui montré dans l'exemple, vous voudrez peut-être vérifier l'attribut _id ou un "unique" (non garanti par MongoDB) (mieux s'il a un index dessus). Par exemple:

var myObj = ...;
collection.findOneAndUpdate({uniqueAttr: myObj.uniqueAttr}, myObj, {upsert: true}, function(){
     ...
});
25
Andrea

À partir de Mongoose 4+, n'oubliez pas de définir nouveau: vrai avec upsert ou vous obtiendrez l'ancien document comme valeur de retour, pas celui mis à jour.

C'est assez délicat surtout lorsque la requête crée un document, comme si vous ne spécifiez pas new: true, vous recevez un document nul (il n'y avait pas de document existant), mais pas d'erreur.

    var myObj = ...;
    collection.findOneAndUpdate(
    {uniqueAttr: myObj.uniqueAttr},
    myObj,
    {upsert: true, new: true},
    function(...) {...}
27
Rayjax