Home > Net >  Mongoose needs 2 times excecution to update collection
Mongoose needs 2 times excecution to update collection

Time:11-24

Something strange is going on or something idiotic I did but I got the following problem.

I got aenter code here web app where I have an online menu for a restaurant.

The structure of the products is as follows.

Facility->Category->Item->Name

So all item models have saved the name of the category they belong to as a string.

But sometimes you want to change the name of the category. What I wanted to do was find all the items in this category and change the name of the assigned category to the new one. Everything looked great until I saw that it took two times to run the controller that changed the name of the category and on the items to fully save the new name to the items.

The category changed the name but the items updated to the new name on the second run. Weird right?

So, what is that you can see that I don't and I implemented the silliest way of bugfix in the history of bugfixes.

Here is the controller - route.

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

CodePudding user response:

The findByIdAndUpdate function returns the found document, i.e. the document before any updates are applied.

This means that on the first run through category is set to the original document. Since the following loop uses category.name, it is setting the category of each item to the unmodified name.

The second iteration find the modified document, and the nested loop uses the new value in category.name.

To get this in a single pass, use

item.category = req.category.name;

or if you aren't certain it will contain a new name, use

item.category = req.category.name || category.name;

Or perhaps instead of a loop, use updateMany

if (req.category.name) {
  ItemModel.updateMany(
      {"item.facility": category.facility},
      {"item.category": req.category.name}
  )
}
  • Related