如何仅更新特定字段并在使用 Mongoose 进行查找和更新时将其他字段保留为以前的值

how to only update specific fields and leave others with the previous values in findandupdate with Mongoose

我使用 Mongoose 创建了一个更新函数。但是,每当我使用 findOneAndUpdate 更新数据时。它只更新输入的字段并使其他字段现在为空或为空。我希望这样当用户更新并且他们不更新文件时,它应该保持原样而不是现在为空。基本上只更新输入的字段。

这是我的路线

router.post("/updateStock", (req, res) => {
    const filter = {prodId: req.body.prodID}

    const update = req.body

    Product.findOneAndUpdate(filter, update, {new: true}).then((product) => {
        console.log("success");
        res.send(product);
  }).catch(err => {
       console.log("err", err);
       res.status(500).send(err);
  })

});

这里有一个 req.body 的例子。 我只更新了前端的标题和类别,这意味着其他所有内容都是空白的。当它保存在数据库中时,它只会更新标题和分类并将其他所有内容留空。我希望它不要将空白的插入数据库并保留字段原样

{
  prodId: 'iPhone 111001200',
  title: 'iPhone 11 Pro',
  manufacturer: '',
  catergory: 'Electronics',
  price: '',
  quantity: ''
}

这是我的模型

const mongoose = require("mongoose");

const Product = mongoose.model(
  "Product",
  new mongoose.Schema({
    title: String,
    manufacturer: String,
    price: String,
    catergory: String,
    quantity: String,
    prodID: String, 
    images: Array
  })
);

module.exports = Product;

然后是这样的:

const update = {};
for (const key of Object.keys(req.body)){
    if (req.body[key] !== '') {
        update[key] = req.body[key];
    }
}
test.findOneAndUpdate(filter, {$set: update}, {new: true}).then((product) => {
        console.log("success");
        res.send(product);
  }).catch(err => {
       console.log("err", err);
       res.status(500).send(err);
  })}

您应该只使用 $set 来更新您想要更新的字段。在您的情况下,字段不是 ''.