首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >猫鼬需要增加2次才能更新集合

猫鼬需要增加2次才能更新集合
EN

Stack Overflow用户
提问于 2021-11-22 23:42:25
回答 1查看 109关注 0票数 0

有些奇怪的事情正在发生,或者我做了一些愚蠢的事情,但我遇到了以下问题。

我有一个入口代码这里的网络应用程序,我有一个在线菜单为一家餐厅。

产品结构如下。

设施->类别->项目->名称

因此,所有项目模型都将其所属类别的名称保存为字符串。

但有时你想要更改这个类别的名称。我想要做的是找到这个类别中的所有项目,并将指定类别的名称更改为新类别。一切看起来都很棒,直到我看到运行了两次才运行了控制器,该控制器更改了类别的名称,并在项目上将新名称完全保存到项目中。

类别更改了名称,但在第二次运行时将项更新为新名称。怪怪的对吧?

所以,您可以看到,我没有,我实现了错误修复历史上最愚蠢的方式。

这是控制器的路线。

代码语言:javascript
复制
  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});
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-23 01:30:15

findByIdAndUpdate函数返回找到的文档,即在应用任何更新之前的文档。

这意味着在第一次运行时,category被设置为原始文档。由于下面的循环使用category.name,所以它将每个项的类别设置为未修改的名称。

第二次迭代找到修改后的文档,嵌套循环在category.name中使用新的值。

若要在一次传递中获得此结果,请使用

代码语言:javascript
复制
item.category = req.category.name;

或者,如果您不确定它将包含一个新名称,请使用

代码语言:javascript
复制
item.category = req.category.name || category.name;

或者使用updateMany代替循环

代码语言:javascript
复制
if (req.category.name) {
  ItemModel.updateMany(
      {"item.facility": category.facility},
      {"item.category": req.category.name}
  )
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70073703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档