rgins16
rgins16

Reputation: 378

Is my Mongoose Schema incorrect?

I believe my Mongoose Schema must be incorrect, because my DB is not updated correctly when I use .save() in Mongoose. After the below nodeJS route runs, the updated Object I received in the callback is correct, but on subsequent runs, the DB object is empty, and was never updated.

Here is an example of what my data will look like:

      var newApplicationData = new ApplicationData({
        pos1: 0,
        pos2: 0,
        applicationData: [

            // Standard One
            {
                sections: [
                    {
                        narrative: '',
                        documentation: []
                    },
                    {
                        narrative: '',
                        documentation: []
                    },
                    {
                        narrative: '',
                        documentation: []
                    }
                ]
            },

            // Standard 2
            {
                sections: [
                    {
                        narrative: '',
                        documentation: []
                    },
                    {
                        narrative: '',
                        documentation: []
                    },
                    {
                        narrative: '',
                        documentation: []
                    },
                    {
                        narrative: '',
                        documentation: []
                    }
                ]
            },

            // Standard 3
            {
                sections: [
                    {
                        narrative: '',
                        documentation: []
                    },
                    {
                        narrative: '',
                        documentation: []
                    },
                    {
                        narrative: '',
                        documentation: []
                    },
                    {
                        narrative: '',
                        documentation: []
                    },
                    {
                        narrative: '',
                        documentation: []
                    },
                    {
                        narrative: '',
                        documentation: []
                    },
                    {
                        narrative: '',
                        documentation: []
                    }
                ]
            },

            // Standard 4
            {
                sections: [
                    {
                        narrative: '',
                        documentation: []
                    },
                    {
                        narrative: '',
                        documentation: []
                    },
                    {
                        narrative: '',
                        documentation: []
                    },
                    {
                        narrative: '',
                        documentation: []
                    },
                    {
                        narrative: '',
                        documentation: []
                    },
                    {
                        narrative: '',
                        documentation: []
                    },
                    {
                        narrative: '',
                        documentation: []
                    },
                    {
                        narrative: '',
                        documentation: []
                    },
                    {
                        narrative: '',
                        documentation: []
                    }
                ]
            },
        ]
    });

Now here is my Mongoose Schema:

const mongoose = require('mongoose');

const ApplicationDataSchema = mongoose.Schema({
pos1: {
    type: Number, 
    required: true,
},
pos2: {
    type: Number,
    required: true,
},
applicationData: {
    type: Array,
    required: true,

    sections: {
        type: Array,
        required: true,

        narrative: {
            type: String,
            required: true
        },
        documentation: {
            type: Array,
            required: true
        }
    }
}
}, { collection : 'applicationData' });

const ApplicationData = module.exports = mongoose.model('ApplicationData', ApplicationDataSchema);

And finally, here is my NodeJS route where I am trying to save data using .save():

app.post('/upload', multer({ storage: storage }).single('file'), (req, res) => {

    if(!req.file) return res.send({ status: 400, msg: 'No File Received.' });

    let pos1 = req.body.pos1;
    let pos2 = req.body.pos2;

    ApplicationData.findById(mongoose.Types.ObjectId(req.body.applicationDataID), (err, applicationDataObject) => {

      if(err) return res.send({ status: 400, msg: err });

      applicationDataObject.applicationData[pos1].sections[pos2].documentation.push(req.file.filename);

      applicationDataObject.save((err, updatedApplicationData) => {

        console.log(applicationDataObject.applicationData[pos1].sections[pos2].documentation);

        if(err) return res.send({ status: 400, msg: err });

        return res.send({ status: 200, applicationData: updatedApplicationData.applicationData });
      });
    });
});

Upvotes: 2

Views: 79

Answers (1)

Orelsanpls
Orelsanpls

Reputation: 23515

When you are using an array of object, put the object description into type

      {
          pos1: {
            type: Number,
            required: true,
          },
          pos2: {
            type: Number,
            required: true,
          },
          applicationData: {
            type: [{
              sections: {
                type: [{
                  narrative: {
                    type: String,
                    required: true,
                  },
                  documentation: {
                    type: Array,
                    required: true,
                  },
                }],
                required: true,
              },
            }],
            required: true,
          },
        }

Best is to use sub schema tho, like :

const subSchema2 = new mongoose.Schema({
  narrative: {
    type: String,
    required: true,
  },
  documentation: {
    type: Array,
    required: true,
  },
})

const subSchema1 = new mongoose.Schema({
  sections: {
    type: [subSchema2],
    required: true,
  },
})

const finalSchema = new mongoose.Schema({
  pos1: {
    type: Number,
    required: true,
  },
  pos2: {
    type: Number,
    required: true,
  },
  applicationData: {
    type: [subSchema1],
    required: true,
  },
})

Upvotes: 2

Related Questions