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;行动。标记修改后的“能源保障”;