Categories
javascript mongoose node.js

Unable to update mongoose model

I have a weird issue that is baffling me. I have a model:

var Model = new Schema({
name: String,
variations: Array
});

The variations entry looks like this:

[ {code: '', price: '' }, {code: '', price: '' }]

I need to add a new field – say “color”. So I am doing this to batch update:

Model.find().exec(function(err, products) {
if (!err) {
products.forEach(function(p) {
for(var i = p.variations.length - 1; i >= 0; i--) {
p.variations[i]['color'] = 'red';
// This shows all existing variations
// with the new color feed - correct
console.log(p.variations[i]);
}
p.save(function(err) {
if (!err) {
console.log("Success");
} else {
console.log(err);
}
});
});
}
});

However the “color” field is not set – if I go through again and comment out the p.variations[i]['color'] = 'red'; line then it does not show. I can’t seem to figure out why it’s doing this. I have an onSave event that is triggered correctly so it’s saving. I also do not have any check on the variations structure – i.e. there is no code that only allows code and price. I’m obviously missing something but after a couple of hours I ran out of ideas.

When you modify the contents of an untyped Array field like variations, you need to notify Mongoose that you’ve changed its value by calling markModified(path) on the modified document or a subsequent save() call won’t save it. See docs.

  for(var i = p.variations.length - 1; i >=0; i--) {
p.variations[i]['color'] = 'red';
}
p.markModified('variations');
p.save(function(err) { ...