2015-12-09 3 views
2

Ниже приводится функция, которая показывает проблему:Результат 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 действительно решает проблему.

Я использую массив пустых типов объектов в схеме, потому что на самом деле этот прецедент имеет дело со схемами, которые наследуют друг от друга, поэтому здесь нет единой схемы.

Это ошибка? Единственное обходное решение, которое я нашел, - очистить массив и снова добавить все элементы. Я хотел бы знать, есть ли лучшее решение.

ответ

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' }); 
+1

Спасибо. Получил аналогичный ответ на вопрос о мангусте github: https://github.com/Automattic/mongoose/issues/3658 – joniba

Смежные вопросы