Du kan använda Array.map för att forma varje indata för användning med en bulkskrivning.
Beteendet du beskriver verkar använda email
för att identifiera varje dokument.
Du angav inte vad som skulle hända med andra fält i dokumenten. Om du vill lämna andra fält ifred, använd $set
för att ta bort fält som inte nämns i inkommande data, använd $replace
.
I skalet ser det ut så här:
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" }
Ta en titt på Model.bulkWrite() för ett exempel på hur man gör detta i mongoose.