Je zou Array.map kunnen gebruiken om elke invoer vorm te geven voor gebruik met een bulkschrijfopdracht.
Het gedrag dat je beschrijft lijkt gebruik te maken van de email veld om elk document te identificeren.
U heeft niet aangegeven wat er met andere velden in de documenten moet gebeuren. Als je andere velden alleen wilt laten, gebruik dan $set gebruik $replace . om velden te verwijderen die niet in de inkomende gegevens worden vermeld .
In de shell ziet dit er als volgt uit:
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" }
Bekijk Model.bulkWrite() voor een voorbeeld van hoe dit te doen in mangoest.