mongoose Model.update() - 仅更新提供的值

时间:2016-11-07 13:25:12

标签: node.js mongodb express mongoose

我有以下架构:

const wordSchema = mongoose.Schema({
  author: {type: String, index: true, default: 'unknown'},
  quote: String,
  source: {type: String, default: 'unknown', index: true},
  rating: {type: Number, default: 0},
  createdAt: {type: Date, default: Date.now},
  updatedAt: {type: Date, default: Date.now},
});

我的快递应用程序中的以下PUT路线:

// Route to update a quote in the DB
app.put('/words/:id', function(req, res) {
  const quote = new Word({
    _id: req.params.id,
    author: req.body.author,
    quote: req.body.quote,
    source: req.body.source,
    rating: req.body.rating,
    updatedAt: Date.now(),
  });
  Word.update(quote, function(err, raw) {
    if (err) {
      res.send(err);
    }
    res.send(raw);
  });
});

现在,当我发送PUT请求时,如果未提供使用默认值设置的参数,则将使用模式中的默认值填充它们。如何仅更新提供的值?

感谢您的帮助。

2 个答案:

答案 0 :(得分:8)

不要为更新创建新的Word实例,update需要使用条件和doc对象参数来分别标识要更新的文档并提供其更新的值:

app.put('/words/:id', function(req, res) {
  const doc = {
    author: req.body.author,
    quote: req.body.quote,
    source: req.body.source,
    rating: req.body.rating,
    updatedAt: Date.now(),
  });
  Word.update({_id: req.params.id}, doc, function(err, raw) {
    if (err) {
      res.send(err);
    }
    res.send(raw);
  });
});

答案 1 :(得分:2)

您可以尝试使用 Model.findByIdAndUpdate() 方法,其中所有非原子操作名称的顶级更新键都被视为设置操作,并且永远不会执行默认值/设置器。您可以使用lodash的 _.assign() 方法设置updatedAt字段:

// Route to update a quote in the DB
app.put('/words/:id', function(req, res) {
    const update = _.assign({ "updatedAt": new Date() }, req.body);
    Word.findByIdAndUpdate(req.params.id, update, function(err, raw) {
        if (err) {
            res.send(err);
        }
        res.send(raw);
    });
});