Отправка одного и того же запроса PUT несколько раз создает больше записей в базе данных - PullRequest
0 голосов
/ 05 апреля 2020

Насколько я знаю, с помощью PUT можно создать ресурс, если он не существует или он собирается заменить старый на новый.

Я хочу создать ресурс и быть в состоянии обновить его, а не создавать больше ресурсов, используя Node.js / Express и MongoDB.

Итак, я написал этот код:

app.put('/entries/:entry_id/type', (req, res) => {
  const entry = new Entry (req.body);
  entry.save();
  res.end();
})

в Почтальоне есть запрос PUT с URL-адресом: localhost:5000/entries/2/type

После однократной отправки он создает запись в базе данных. Все хорошо!

Но давайте попробуем отправить тот же запрос еще раз. Сейчас в базе 2 записи. Я ожидаю, что он будет один, поскольку один и тот же запрос был отправлен.

В базе данных они имеют одинаковые данные, одну и ту же схему, но у них есть дополнительное поле "_id":{"$oid":"5e8909e60c606c002axxxxxx"},, в котором последний символ отличается .

Почему создано больше записей с одинаковыми данными, хотя я ожидал, что в базе данных будет только одна запись?

1 Ответ

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

Пн go автоматически создает индекс по умолчанию с именем _id в каждой коллекции при ее создании. Если вы вставите документ в коллекцию без указания _id, он создаст новый ObjectId в качестве поля _id.

Чтобы обойти это, вы можете использовать findOneAndUpdate с upsert:

Entry.findOneAndUpdate({ entry_id: req.params.entry_id }, { <content> }, { upsert: true })

Однако это обновит документ, если он уже существует, вместо создания новый. Если вы в дальнейшем sh не будете изменять документ вообще, если он уже существует, тогда вы можете окружить свой <content> $setOnInsert.

...