Reputation: 378
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
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