Array.mapを使用して、一括書き込みで使用する各入力を整形できます。
あなたが説明している動作は、email
を使用しているようです 各ドキュメントを識別するためのフィールド。
ドキュメント内の他のフィールドで何が起こるべきかを示していませんでした。他のフィールドをそのままにしておきたい場合は、$set
を使用してください 受信データに記載されていないフィールドを削除するには、$replace
を使用します 。
シェルでは、これは次のようになります:
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" }
Model.bulkWrite() をご覧ください。 マングースでこれを行う方法の例については。