Вы можете попробовать этот фрагмент (хотя не проверял его локально).Идея состоит в том, чтобы обновить только те поля в Product, которые были упомянуты в req.body.Убедитесь, что ваш валидатор безопасен, иначе вы можете получить инъекцию nosql.
router.put('/:id', async (req, res) => {
const { error } = validateProduct(req.body);
if (error) return res.status(400).send(error.details[0].message);
const product = await Product.findById(req.params.id).exec();
if (!product) return res.status(404).send('The product with the given ID was not found.');
let query = {$set: {}};
for (let key in req.body) {
if (product[key] && product[key] !== req.body[key]) // if the field we have in req.body exists, we're gonna update it
query.$set[key] = req.body[key];
const updatedProduct = await Product.updateOne({_id: req.params.id}, query}).exec();
res.send(product);
});
Также я уверен, что вы можете использовать lodash в строке, где я использую цикл for-in;)
Недостатком этого подхода является то, что для монго требуется 2 запроса, потому что для сравнения необходим реальный документ.Также операция обновления не запускает зацепки после сохранения вашей модели.Если они вам нужны - сначала вы должны найтиById (), обновить необходимые поля, а затем нажать .save () в самом документе, который вы нашли.Надеюсь, это поможет