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?
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(){
...
});
À 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(...) {...}