Ниже приводится функция, которая показывает проблему:Результат mongoose.save неверен при добавлении элемента в смешанный массив схемы
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
действительно решает проблему.
Я использую массив пустых типов объектов в схеме, потому что на самом деле этот прецедент имеет дело со схемами, которые наследуют друг от друга, поэтому здесь нет единой схемы.
Это ошибка? Единственное обходное решение, которое я нашел, - очистить массив и снова добавить все элементы. Я хотел бы знать, есть ли лучшее решение.
Спасибо. Получил аналогичный ответ на вопрос о мангусте github: https://github.com/Automattic/mongoose/issues/3658 – joniba