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:这个()对你有帮助吗?