Выполнение обновления пути «_id» изменит неизменяемое поле «_id»

Я пытаюсь ОБНОВИТЬ поля в базе данных монго. Тем не менее, я получаю ошибку полого.

MongoError: Performing an update on the path '_id' would modify the immutable field '_id'

Мой код для обновления.

app.put("/api/inventory/:sku", (req, res, next) => {
  const inventory = new Inventory({
    _id: req.body.id,
    sku: req.body.sku,
    total_qty: req.body.total_qty,
    current_qty: req.body.current_qty
  });
  Inventory.updateOne({ sku: req.params.sku }, req.body).then(result => {
    res.status(200).json({ message: "Update successful!" });
  });
});
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
6
0
38 760
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

_id создается автоматически — более подробное объяснение того, что это такое, см. в статье этот ответ.

Вы не можете создать это поле — оно создается при создании любого нового документа. Вам нужно использовать поле id (без подчеркивания в начале _):

const inventory = new Inventory({
  id: req.body.id,
  sku: req.body.sku,
  total_qty: req.body.total_qty,
  current_qty: req.body.current_qty
});

В этом руководстве по mongoDB: mongodb.com/blog/post/paging-with-the-bucket-pattern--part-2‌​. запрос updateOne влияет на ключ «_id», поэтому мой вопрос в том, почему этот пример работает, а этот не работает, это проблема с драйвером.

Margach Chris 15.04.2021 10:44

Кажется, вам нужно обновить только одну Inventory запись. Вы можете просто сделать это:

app.put("/api/inventory/:sku", (req, res, next) => {
  return Inventory.updateOne(
    { sku: req.params.sku },  // <-- find stage
    { $set: {                // <-- set stage
       id: req.body.id,     // <-- id not _id
       sku: req.body.sku,
       total_qty: req.body.total_qty,
       current_qty: req.body.current_qty
      } 
    }   
  ).then(result => {
    res.status(200).json({ message: "Update successful!" });
  });
});

Нет необходимости создавать новые Inventory и т. д., поскольку все, что вам нужно, это обновить существующий на основе sku.

Вот дополнительная документация по updateOne

Другие вопросы по теме