Puede usar Array.map para dar forma a cada entrada para usar con una escritura masiva.
El comportamiento que estás describiendo parece estar usando el email
campo para identificar cada documento.
No indicó qué debería suceder con otros campos en los documentos. Si desea dejar otros campos solos, use $set
para eliminar cualquier campo no mencionado en los datos entrantes, use $replace
.
En el caparazón, esto se ve así:
PRIMARY> db.users.find()
{ "_id" : 1, "email" : "[email protected]", "name" : "one" }
{ "_id" : 2, "email" : "[email protected]", "name" : "two" }
{ "_id" : 3, "email" : "[email protected]", "name" : "three" }
PRIMARY> let users = [
{ email: "[email protected]", name: "oneeee" },
{ email: "[email protected]", name: "twoooo" },
{ email: "[email protected]", name: "three" },
{ email: "[email protected]", name: "four" }
]
PRIMARY> let bulkUpdate = db.users.initializeUnorderedBulkOp()
PRIMARY> users.forEach(u => bulkUpdate.find({email:u.email}).upsert().update({$set:u}))
PRIMARY> bulkUpdate.execute()
BulkWriteResult({
"writeErrors" : [ ],
"writeConcernErrors" : [ ],
"nInserted" : 0,
"nUpserted" : 1,
"nMatched" : 3,
"nModified" : 2,
"nRemoved" : 0,
"upserted" : [
{
"index" : 3,
"_id" : ObjectId("5f5e79ff28ee536df4c4a88e")
}
]
})
PRIMARY> db.users.find()
{ "_id" : 1, "email" : "[email protected]", "name" : "oneeee" }
{ "_id" : 2, "email" : "[email protected]", "name" : "twoooo" }
{ "_id" : 3, "email" : "[email protected]", "name" : "three" }
{ "_id" : ObjectId("5f5e79ff28ee536df4c4a88e"), "email" : "[email protected]", "name" : "four" }
Eche un vistazo a Model.bulkWrite() para ver un ejemplo de cómo hacer esto en mongoose.