使用一个查询或多个(mongoose)更新子文档?

时间:2015-03-17 08:40:59

标签: mongodb mongoose mongodb-query

这是我的文件的一部分:

var actions = {

  title: 'Change of windows'
  energySavings:[
  {
     _id: 234324234,
     mainCategory: 'Elektricitet',
     subCategory: 'Belysning',
     value: 1
  },
  {
    _id: 5434534543,
    mainCategory: 'Elektricitet',
    subCategory: 'Utrustning',
    value: 1
  }
 ]
}

我希望能够更新energySavings,添加项目和删除项目。这可以在三个单独的查询中完成。或者,我只能在一个

中完成
var givenAction = JSON.parse(req.body.action);

mongoose.model('Action').findOne({actionId: req.params.actionId}, function(err, action){

    action.energySavings = givenAction.energySavings;

    action.save(function(err, savedAction){
      res.status(200).send(savedAction);
    });

  })

方式更少的代码然后三个单独的查询。但是,如果客户端程序员犯了一个错误,例如清空整个数组并保存它,我们就会遇到问题。有没有最好的做法,在一个查询或几个更多控制?

1 个答案:

答案 0 :(得分:0)

您还可以使用findOneAndUpdate mongoose更新文档。如果错误地添加了空数组,则需要在更新或添加查询之前检查if查询是否为空。

var givenAction = JSON.parse(req.body.action);

mongoose.model('Action').findOneAndUpdate({
    actionId: req.params.actionId
}, {
    $set: { 
        energySavings: givenAction.energySavings
    }
}, callback);

您可以使用$push添加新项目,$pull删除项目而不是$set来更新项目。我不认为在一个查询中更新energySavings,添加项目和删除项目不是一个好选择。