У меня есть база данных, которая заполняется из разных 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 });
]
});
});
Мне нужно сделать некоторые дополнительные проверки, поэтому было бы здорово, если бы я мог просто выполнить простой поиск, чтобы решить, обновлять или вставлять. Но это может быть слишком неэффективно.
"upsert"
в том, что вы обращаетесь к базе данных один раз, а не дважды. Кроме того, если вам действительно не нужен документ обратно, даже.findOneAndUpdate()
не нужен, и вместо этого вы должны использовать.update()
. Или, если вы на самом деле работаете массово, то.bulkWrite()
. Но всегда"upsert"
или вставлять и отклонять повторяющиеся ошибки. Ничего похожего на.find() -> "modify" .save()
, которого лучше избегать. - person Neil Lunn   schedule 27.07.2017