2013-12-07 2 views
3

Я делаю простой findOne() и сохраняю документ в нем, но по какой-то причине он не работает. Я вывел объект, а вывод в консоли правильный, но после сохранения() я взглянул на мой mongodb, и это не спасло. Я не уверен, есть ли какой-то вариант, который я должен установить. Вот мой код:mongoose findOne() вызов не сохраняется и нет ошибки в выходе

var1 = "data1"; 
var2 = "data1field1"; 
Model.findOne({'_id':some_id}).exec(function(err, doc) { 
    if (err) return console.error(err); 
    (doc.data[var1][var2][0] += 1; 
    console.log(doc.data.data1); 
    doc.save(function (err) { 
     if(err){console.log(err);} 
     console.log('success'); 
    }); 
}); 

Вот моя схема:

var modelSchema = new mongoose.Schema({ 
    'data':{ 
     'data1':{ 
      'data1field1':[{type: Number}], 
      'data1field2':[{type: Number}] 
     }, 
     'data2':{ 
      'data2field1':[{type: Number}], 
      'data2field2':[{type: Number}] 
     } 
    } 
}); 
var Model = mongoose.model('model', modelSchema); 
module.exports.Model = Model; 

Say я создаю экземпляр этой схемы, где data.data1.data1field1 представляет собой массив из двух чисел [0,0], вывод для «console.log (doc.data.data1)»; будет:

{ 
    data1field1:[1,0], 
    data1field2:[0,0] } 
success 

Но спасение не происходит. Я новичок в mongoose/mongodb, поэтому есть, вероятно, простая фундаментальная вещь, которую я не хватает.

ПРИМЕЧАНИЕ: Я не могу использовать Model.update ({}, {$ inc {}}), потому что я использую переменные, чтобы выбрать, какой объект данных нужно изменить, и из-за литералов в .update() это невозможно.

Спасибо.

ответ

7

Так что у мангуста есть некоторые умения, чтобы автоматически обнаруживать изменения, когда вы делаете простые наборы свойств, такие как myModel.name = 'Steve'. Однако, когда вы получаете доступ к глубоко вложенным схемам и изменяете свойства в глубине графика, документ верхнего уровня не может автоматически обнаружить это. Поэтому вам нужно сказать, что вы изменили.

doc.markModified('data.' + var1 + '.' + var2); 

Если у вас есть правильное заклинание, мангуст сможет сохранить ваши изменения.

+0

Я чувствую, что узнал что-то важное. Благодаря! – PGT

+0

@ peter-lyons: В моем сценарии я изменяю свойство прямого (1-го уровня). Например, doc.userStatus = "active", но по-прежнему возникает одна и та же проблема. :( –

+1

Даже после вызова doc.markModified («userStatus») он не работает. –

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