Anda dapat menggunakan Array.map untuk membentuk setiap input untuk digunakan dengan penulisan massal.
Perilaku yang Anda gambarkan tampaknya menggunakan email untuk mengidentifikasi setiap dokumen.
Anda tidak menunjukkan apa yang seharusnya terjadi dengan bidang lain dalam dokumen. Jika Anda ingin membiarkan bidang lain saja, gunakan $set untuk menghapus bidang yang tidak disebutkan dalam data yang masuk, gunakan $replace .
Di shell ini terlihat seperti:
PRIMARY> db.users.find()
{ "_id" : 1, "email" : "example@sqldat.com", "name" : "one" }
{ "_id" : 2, "email" : "example@sqldat.com", "name" : "two" }
{ "_id" : 3, "email" : "example@sqldat.com", "name" : "three" }
PRIMARY> let users = [
{ email: "example@sqldat.com", name: "oneeee" },
{ email: "example@sqldat.com", name: "twoooo" },
{ email: "example@sqldat.com", name: "three" },
{ email: "example@sqldat.com", 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" : "example@sqldat.com", "name" : "oneeee" }
{ "_id" : 2, "email" : "example@sqldat.com", "name" : "twoooo" }
{ "_id" : 3, "email" : "example@sqldat.com", "name" : "three" }
{ "_id" : ObjectId("5f5e79ff28ee536df4c4a88e"), "email" : "example@sqldat.com", "name" : "four" }
Lihat Model.bulkWrite() untuk contoh cara melakukannya di luwak.