Обновите или создайте в Mongoose

У меня есть база данных, которая заполняется из разных API.

Прямо сейчас я просто удаляю весь контент из базы данных и заполняю всеми данными.

Однако это не очень хороший подход, поскольку я хочу сохранить исходные документы.

Как лучше всего проверить, существует ли объект; если это так, его следует обновить новыми данными, а если нет, его следует просто создать. Поэтому я пытаюсь создать функцию updateOrCreate.

Я немного читал о upsert, который, кажется, делает это. Однако не было бы так же эффективно создать цикл:

itemsToBePopulatedWith.forEach(item => {
  Item.findOne({ name: item.name }).then(existingItem => {
    if (existingItem) {
      existingItem.date = item.date;
      existingItem.user = item.user;
      ...

      existingItem.save();
    } else {
      Item.create({ date: item.date, user: item.user });
    ]
  });
});

Мне нужно сделать некоторые дополнительные проверки, поэтому было бы здорово, если бы я мог просто выполнить простой поиск, чтобы решить, обновлять или вставлять. Но это может быть слишком неэффективно.


person Jamgreen    schedule 26.07.2017    source источник
comment
Отличие "upsert" в том, что вы обращаетесь к базе данных один раз, а не дважды. Кроме того, если вам действительно не нужен документ обратно, даже .findOneAndUpdate() не нужен, и вместо этого вы должны использовать .update(). Или, если вы на самом деле работаете массово, то .bulkWrite(). Но всегда "upsert" или вставлять и отклонять повторяющиеся ошибки. Ничего похожего на .find() -> "modify" .save(), которого лучше избегать.   -  person Neil Lunn    schedule 27.07.2017
comment
Также, если это не совсем очевидно, этот связанный дубликат является примером того, где принятый ответ полностью неверен. Лучшие ответы и шаблоны действительно получают больше голосов.   -  person Neil Lunn    schedule 27.07.2017