2014-10-17 4 views
4

Я использую массив строк для сохранения сообщений электронной почты:Mongoose: присвоить поле типа «массив строки»

var user = new Schema({ 
    // other fields... 

    emails: [String] 
}); 

Есть проблемы с обновлением этого поля. Скажем, EMAIL1 и email2 ценности, я получаю с точки зрения:
Это хорошо работает:

user.emails = [email1, email2]; 
user.save(); 
// fields are updated, all good 

И это не делает:

user.emails[0] = email1; 
user.emails[1] = email2; 
user.save(function(err, savedUser) { 
    console.log(savedUser.emails); // updated array [email1, email2] 
    // but if I retrieve now the user, the 'emails' field will not have above changes. 
}); 

Но, как ни странно, это работает:

user.emails = [email1]; 
user.emails[1] = email2; 
user.save(); 
// user.emails == [email1, email2]; 

Может кто-нибудь объяснить, почему это происходит?

ответ

10

Это плохо документировано, но при манипулировании полями массива вам необходимо убедиться, что вы запускаете обнаружение изменений в Mongoose, чтобы он знал, что массив был изменен и его необходимо сохранить.

Непосредственно установка элемента массива с помощью его индекса в квадратных скобках не отметить его модифицирован таким образом, вы должны вручную пометьте его с помощью markModified:

user.emails[0] = email1; 
user.markModified('emails'); 

Или вы можете сделать это на одном дыхании, используя set метод массива Mongoose:

user.emails.set(0, email1); 

Перезапись все поле массива также вызывает его поэтому это работает для вас:

user.emails = [email1, email2]; 

, а также:

user.emails = [email1]; 
user.emails[1] = email2; 

Это означает, что это также работает:

user.emails = []; 
user.emails[0] = email1; 
user.emails[1] = email2; 
+0

Большое спасибо !!! Знаете ли вы, как он мог работать в моих тестах без запуска обнаружения изменения поля? – eagor

+0

@eagor Какой случай неожиданно работает в ваших тестах? – JohnnyHK

+0

элементы настройки индивидуально (user.emails [0] = email1 ...). Не имел никакого эффекта в среде «dev», но хорошо работал в «тесте» (обновлен массив вновь восстановленного объекта) – eagor

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