MongoDB: массовое создание или обновление - PullRequest
1 голос
/ 07 апреля 2020

У меня есть массив данных, которые я хочу вставить в свою базу данных:

[
  {
    "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"
  },
]

Я знаю, что могу использовать метод .create из mon goose для вставки всех данных.

Однако в данных мне нужно иметь возможность сочетать новые и существующие значения. Например, если пользователь с идентификатором 816307 (Джон Доу) уже существует, но имеет другой адрес электронной почты, он должен обновить значение, и в то же время, если пользователь с идентификатором 391650 (Мэри Уильямс) не существует, он должен создать it.

Поле id не может быть обновлено.

Похоже, что лучший метод для использования - это updateMany и использование опции upsert для вставки новых элементов в в то же время .updateMany () .

Но как сделать ссылку на id? Я не могу использовать $eq и жестко закодировать что-либо здесь, я хотел бы, чтобы документ автоматически нашел нужный элемент по его id и обновил его, если он существует, в противном случае создайте его.

1 Ответ

0 голосов
/ 07 апреля 2020

Поскольку каждый объект имеет свой собственный фильтр и обновление, вы, возможно, не сможете сделать это с помощью .updateMany(), вместо этого вы можете использовать MongoDB .bulkWrite () , с помощью которого вы можете делать что-то в один вызов БД, внутри 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)
...