Du kan bruge Array.map til at forme hvert input til brug med en masseskrivning.
Den adfærd, du beskriver, ser ud til at bruge email
felt for at identificere hvert dokument.
Du har ikke angivet, hvad der skulle ske med andre felter i dokumenterne. Hvis du vil lade andre felter være i fred, skal du bruge $set
for at fjerne felter, der ikke er nævnt i de indgående data, skal du bruge $replace
.
I skallen ser det sådan ud:
PRIMARY> db.users.find()
{ "_id" : 1, "email" : "one@gmail.com", "name" : "one" }
{ "_id" : 2, "email" : "two@gmail.com", "name" : "two" }
{ "_id" : 3, "email" : "three@gmail.com", "name" : "three" }
PRIMARY> let users = [
{ email: "one@gmail.com", name: "oneeee" },
{ email: "two@gmail.com", name: "twoooo" },
{ email: "three@gmail.com", name: "three" },
{ email: "four@gmail.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" : "one@gmail.com", "name" : "oneeee" }
{ "_id" : 2, "email" : "two@gmail.com", "name" : "twoooo" }
{ "_id" : 3, "email" : "three@gmail.com", "name" : "three" }
{ "_id" : ObjectId("5f5e79ff28ee536df4c4a88e"), "email" : "four@gmail.com", "name" : "four" }
Tag et kig på Model.bulkWrite() for et eksempel på, hvordan man gør dette i mongoose.