比如说,我有一些文件,如
[
{
fname: "FirstName1",
lname: "LastName1",
email: "[email protected]"
},
{
fname: "FirstName2",
lname: "LastName2",
email: "[email protected]"
},
...
]
,都已经存在于数据库中。现在我要用insertMany插入多个文档到该数据库中,其中一些对象包含相同的电子邮件ID,比如---------。
[
{
fname: "FirstName3",
lname: "LastName3",
email: "[email protected]"
},
{
fname: "FirstName4",
lname: "LastName4",
email: "[email protected]"
},
{
fname: "FirstName5",
lname: "LastName5",
email: "[email protected]"
},
...
]
所以我需要将之前的文档替换成其他字段,其中包含与插入的文档相同的电子邮件ID。所以我想让数据库看起来像这样。
[
{
fname: "FirstName4",
lname: "LastName4",
email: "[email protected]"
},
{
fname: "FirstName5",
lname: "LastName5",
email: "[email protected]"
},
{
fname: "FirstName3",
lname: "LastName3",
email: "[email protected]"
},
...
]
是否有任何解决方案。请让我知道.谢谢.
你不能用insertMany来做。 为此,你需要 使用upsert选项进行批量更新.
下面是两种不同的语法,你需要循环创建批量查询。(可能有排版错误,代码未测试)
var bulk = db.collection_name.initializeUnorderedBulkOp();
bulk.find( { email: "[email protected]" } ).upsert().update( { $set: { fname: "FirstName4", lname: "LastName4", email: "[email protected]" } } );
bulk.find( { email: "[email protected]" } ).upsert().update( { $set: { fname: "FirstName5", lname: "LastName5", email: "[email protected]" } } );
bulk.find( { email: "[email protected]" } ).upsert().update( { $set: { fname: "FirstName3", lname: "LastName3", email: "[email protected]" } } );
bulk.execute();
另一种语法
var ops = []
objectsArray.forEach(item => {
ops.push(
{
updateOne: {
filter: { email: item .email},
update: {
$set: { fname: item.fname, lname: item.lname, email: item.email }
},
upsert: true
}
}
)
})
db.collections('collection_name').bulkWrite(ops, { ordered: false });
如果您使用的是mongoose,请检查 编写文档