MongoDB:批量创建或更新
我有一个要插入数据库的数据数组:MongoDB:批量创建或更新,mongodb,mongoose,mongodb-query,Mongodb,Mongoose,Mongodb Query,我有一个要插入数据库的数据数组: [ { "id":"816307", "email": "john.doe@test.com", "firstName": "John", "lastName": "Doe" }, { "id":"391650", "email": "mary@williams", "firstName": "Mary", "lastName": "Williams" }, { "id"
[
{
"id":"816307",
"email": "john.doe@test.com",
"firstName": "John",
"lastName": "Doe"
},
{
"id":"391650",
"email": "mary@williams",
"firstName": "Mary",
"lastName": "Williams"
},
{
"id":"183751",
"email": "paul.smith@test.com",
"firstName": "Paul",
"lastName": "Smith"
},
]
我知道我可以使用mongoose的.create
方法插入所有数据
但是,在数据中,我需要能够有新值和现有值的组合。例如,如果id为816307
(John Doe)的用户已存在,但有不同的电子邮件,则应更新该值,同时,如果id为391650
(Mary Williams)的用户不存在,则应创建该值
无法更新id
字段
目前使用的最佳方法似乎是updateMany
,同时使用upsert
选项插入新元素
但是,如何引用
id
?我不能在这里使用$eq
和硬编码任何东西,我希望文档自动根据其id
找到合适的项,并在其存在时进行更新,否则,创建它。由于每个对象都有自己的过滤器和更新,因此您可能无法使用.updateMany()
,相反,您可以使用MongoDB,通过它您可以在一个DB调用中完成一些事情,而MongoDB将在内部执行多个写操作
尝试以下代码:
let input = [
{
id: "816307",
email: "john.doe@test.com",
firstName: "John",
lastName: "Doe",
},
{
id: "391650",
email: "mary@williams",
firstName: "Mary",
lastName: "Williams",
},
{
id: "183751",
email: "paul.smith@test.com",
firstName: "Paul",
lastName: "Smith",
},
];
let bulkArr = [];
input.forEach((each) => {
bulkArr.push({
updateOne: {
filter: each.id,
update: {
$set: {
email: each.email,
firstName: each.firstName,
lastName: each.lastName,
},
},
upsert: true,
},
});
});
db.collection.bulkWrite(bulkArr)
由于每个对象都有自己的筛选器和更新,因此您可能无法使用
.updateMany()
,而可以使用MongoDB,通过它可以在一个DB调用中执行操作,MongoDB内部将执行多个写操作
尝试以下代码:
let input = [
{
id: "816307",
email: "john.doe@test.com",
firstName: "John",
lastName: "Doe",
},
{
id: "391650",
email: "mary@williams",
firstName: "Mary",
lastName: "Williams",
},
{
id: "183751",
email: "paul.smith@test.com",
firstName: "Paul",
lastName: "Smith",
},
];
let bulkArr = [];
input.forEach((each) => {
bulkArr.push({
updateOne: {
filter: each.id,
update: {
$set: {
email: each.email,
firstName: each.firstName,
lastName: each.lastName,
},
},
upsert: true,
},
});
});
db.collection.bulkWrite(bulkArr)
我应该如何验证数据?我在
upsert:true
之后添加了runValidators:true
,但它没有work@Raphael:您试图验证什么?所有输入的data@Raphael:这个()对您有帮助吗?我应该如何验证数据?我在upsert:true
之后添加了runValidators:true
,但它没有work@Raphael:您试图验证什么?所有输入的data@Raphael:这个()对你有帮助吗?