Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 使用一个查询或多个查询更新子文档(mongoose)?_Mongodb_Mongoose_Mongodb Query - Fatal编程技术网

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

Mongodb 使用一个查询或多个查询更新子文档(mongoose)?,mongodb,mongoose,mongodb-query,Mongodb,Mongoose,Mongodb Query,这是我文件的一部分: var actions = { title: 'Change of windows' energySavings:[ { _id: 234324234, mainCategory: 'Elektricitet', subCategory: 'Belysning', value: 1 }, { _id: 5434534543, mainCategory: 'Elektricitet', su

这是我文件的一部分:

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);
    });

  })

更少的代码,然后是三个独立的查询。但是,如果客户端程序员犯了一个错误,例如清空整个数组并保存它,我们将遇到问题。是否有一种最佳做法,通过一次查询或多次查询进行更多控制?

您也可以使用mongoose的findOneAndUpdate更新文档。对于错误添加空数组的情况,您需要在更新或添加之前检查查询是否为空

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

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

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

findOneAndUpdate不经过mongoose验证。所以我想使用save。您也可以在保存之前通知Mongoose数据集已更改,如下所示:action.energySavings=givenAction.energySavings;行动。标记修改后的“能源保障”;