updateone update findoneandupdate and javascript node.js mongodb mongoose

javascript - updateone - mongodb c# findoneandupdate



Mongoose findOneAndUpdate y upsert no devuelve errores ni documentos afectados (2)

A partir de Mongoose 4+, no olvide establecer new: true junto con upsert o obtendrá el documento antiguo como un valor de retorno, no el actualizado.

Esto es bastante complicado, especialmente cuando la solicitud crea un documento, como si no especificara nuevo: verdadero, recibe un documento nulo (no había ningún documento existente), pero no hubo ningún error.

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

Tengo un modelo muy minimalista:

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

Estoy intentando agregar un solo documento si no existe. Actualmente, no hay documentos mientras pruebo:

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

Esto está usando las opciones de upsert de los documentos de Mongoose

Sin embargo, err es null , numberAffected es nulo. ¿Por qué no se actualiza mi documento?


en su código, está utilizando la versión de 3 parámetros del método findOneAndUpdate , por lo que, según la documentación que publicó, los parámetros son: A.findOneAndUpdate(conditions, update, callback) .

Debe usar la cuarta versión de los parámetros del método para especificar la opción upsert.

Me gustaría señalar que nunca usé el marco mangosta. Espero que esto ayude.

Edición: Sí, en su caso, las conditions y la update son las mismas. Si su objeto es más complejo que el que se muestra en el ejemplo, es posible que desee verificar el atributo _id o un atributo "único" (no garantizado por MongoDB) (mejor si tiene un índice). Por ejemplo:

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