以下是一个显示问题的函数:
var mongoose = require('mongoose');
var connection = mongoose.createConnection('mongodb://localhost:27017');
connection.once('open', function () {
var schema = new mongoose.Schema({
obj: [{}] //mongoose.Schema.Types.Mixed
});
var Model = connection.model('mtest', schema);
var model = new Model({
obj: [{ name: 'Original' }]
});
model.save(function (err, res) {
console.log('result 1', res);
Model.findOne({_id: res._id}, function (err, res) {
res.obj[0].name = 'Modified';
res.obj.push({ name: 'other' });
//res.markModified('obj'); // using markModified does not help
res.save(function (err, res) {
console.log('result 2', res);
connection.close();
process.exit();
});
});
})
});
"结果2"的输出节目" Modified
"对于" obj"中的第一项:obj: [ { name: 'Modified' }, { name: 'other' } ]
。
但是,在数据库中,第一个项目的值仍然是" Original
"。
仅当将第二个项目推入数组时才会发生这种情况(否则第一个项目确实被修改)。
添加markModified
确实可以解决问题。
我在模式中使用了一些空对象类型,因为实际上这个用例处理的是彼此继承的模式,因此这里不能使用单个模式。
这是一个错误吗?我发现的唯一解决方法是清除阵列并再次添加所有项目。我想知道是否有更好的解决方案。
答案 0 :(得分:1)
您可以更改markModified
来电,以确定您更改的元素的索引"外部"数组访问方法:
res.obj[0].name = 'Modified';
res.obj.push({ name: 'other' });
res.markModified('obj.0');
或切换到使用set
数组访问方法来提醒name
(看起来很傻,但确实有效):
res.obj[0].name = 'Modified';
res.obj.set(0, res.obj[0]);
res.obj.push({ name: 'other' });