有些奇怪的事情正在发生,或者我做了一些愚蠢的事情,但我遇到了以下问题。
我有一个入口代码这里的网络应用程序,我有一个在线菜单为一家餐厅。
产品结构如下。
设施->类别->项目->名称
因此,所有项目模型都将其所属类别的名称保存为字符串。
但有时你想要更改这个类别的名称。我想要做的是找到这个类别中的所有项目,并将指定类别的名称更改为新类别。一切看起来都很棒,直到我看到运行了两次才运行了控制器,该控制器更改了类别的名称,并在项目上将新名称完全保存到项目中。
类别更改了名称,但在第二次运行时将项更新为新名称。怪怪的对吧?
所以,您可以看到,我没有,我实现了错误修复历史上最愚蠢的方式。
这是控制器的路线。
module.exports.updateCtg = async(req,res)=>{
const {id} = req.params;
for(i=0;i<2; i++){
category = await CategoryModel.findByIdAndUpdate(id,{...req.body.category});
await category.save();
items = await ItemModel.find({});
for(item of items){
if(item.facility === category.facility){
item.category = category.name;
await single.save();
}
}
}
res.render('dashboard/ctgview', {category._id});
}发布于 2021-11-23 01:30:15
findByIdAndUpdate函数返回找到的文档,即在应用任何更新之前的文档。
这意味着在第一次运行时,category被设置为原始文档。由于下面的循环使用category.name,所以它将每个项的类别设置为未修改的名称。
第二次迭代找到修改后的文档,嵌套循环在category.name中使用新的值。
若要在一次传递中获得此结果,请使用
item.category = req.category.name;或者,如果您不确定它将包含一个新名称,请使用
item.category = req.category.name || category.name;或者使用updateMany代替循环
if (req.category.name) {
ItemModel.updateMany(
{"item.facility": category.facility},
{"item.category": req.category.name}
)
}https://stackoverflow.com/questions/70073703
复制相似问题