如何使用 Mongoose 在 findandupdate 中仅更新特定字段并将其他字段保留为先前的值

noo*_*23r 5 javascript mongoose mongodb node.js

我使用 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);
  })

});
Run Code Online (Sandbox Code Playgroud)

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

{
  prodId: 'iPhone 111001200',
  title: 'iPhone 11 Pro',
  manufacturer: '',
  catergory: 'Electronics',
  price: '',
  quantity: ''
}
Run Code Online (Sandbox Code Playgroud)

这是我的模型

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;
Run Code Online (Sandbox Code Playgroud)

nim*_*rok 4

然后是这样的:

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);
  })}
Run Code Online (Sandbox Code Playgroud)

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