Home > Mobile >  insert an array of object ids mongoose nodejs
insert an array of object ids mongoose nodejs

Time:03-07

I want to be able to post several Object id's into the array,, I have two models control and subcontrol is referenced in the control model as an array. The idea is a control number might have sub control number under it

My post method:

router.post(
  '/add',
  auth,
  role.checkRole(role.ROLES.Admin, role.ROLES.Regulator),
  async (req, res) => {
    try {

      const subControls = []
             
      for(const subControl of req.body.subControls){

        const tableSubControl ={
            subControlNo: subControl.subControlNo
        };

        const newSubControls = new SubControl(tableSubControl);

    const subControlDoc = await newSubControls.save();
    const control = new Control({...req.body, subControl: subControlDoc._id}); 
    const savedControl = await control.save();

    subControls.push(newSubControls)
  }

      res.status(200).json({
        success: true,
        message: `Control has been added successfully!`,
        control: savedControl
      });
    } catch (error) {
      return res.status(400).json({
        error
        // error: 'Your request could not be processed. Please try again.'
      });
    }
  }
);

Control Schema:

const ControlSchema = new Schema({
  _id: {
    type: Schema.ObjectId,
    auto: true
  },
  mainControl: {
    type: String
  },
 subControl: [
  {
    type: Mongoose.Schema.Types.ObjectId,
    ref: 'SubControl'
  }
  ],
  controlDescription: {
    type: String,
    trim: true
  },
  updated: Date,
  created: {
    type: Date,
    default: Date.now
  }
});

module.exports = Mongoose.model('Control', ControlSchema);

My subControl schema:

const SubControlSchema = new Schema({
   _id: {
     type: Schema.ObjectId,
     auto: true
   },
   subControlNo: {
     type: String
   },
  updated: Date,
  created: {
    type: Date,
    default: Date.now
  }
});

module.exports = Mongoose.model('SubControl', SubControlSchema);

Postman:

{
   "mainControl": "1-1",
   "subControls": 
   [
   {
    "subControlNo": "1-2-1"
   },
    {
    "subControlNo": "1-2-2"
   }
   ],
  "controlDescription": "controldescription"
  }

I'm not getting any clear error,, any idea what I need to do?

CodePudding user response:

Well I am guessing when you create new Control object from req.body then don't set subControl:subcontrol._id there. Instead a object subcontrol should be assigned to Control object.

const subControlDoc = await newSubControls.save();
const control = new Control({...req.body});


control.subcontrol = subControlDoc
const subControlDoc = await newSubControls.save();
const savedControl = await control.save();

subControls.push(newSubControls)

CodePudding user response:

We can manage this using Population : Consider the following changes in the code, I have tried adding comments too.

router.post(
  "/add",
  auth,
  role.checkRole(role.ROLES.Admin, role.ROLES.Regulator),
  async (req, res) => {
    try {
      //first create a single control document
      const control = new Control({
        mainControl: req.body.mainControl,
        controlDescription: req.body.controlDescription,
      });
      //nitpick: the for loop below can be made async.
      
      for (const subControl of req.body.subControls) {
        const tableSubControl = {
          subControlNo: subControl.subControlNo,
        };
        const newSubControls = new SubControl(tableSubControl);
        const subControlDoc = await newSubControls.save();
        //save the looped subControl document
        control.subControls.push(subControlDoc);
        //push the association to the control document.
      }
      //save the control document, I moved it outside the loop
      const savedControl = await control.save();
      
      res.status(200).json({
        success: true,
        message: `Control has been added successfully!`,
        control: savedControl,
      });
    } catch (error) {
      return res.status(400).json({
        error,
        // error: 'Your request could not be processed. Please try again.'
      });
    }
  }
);
  • Related