2014-01-26 2 views
8

Так что я обновляю атрибут пользовательского вспомогательного документа в mongoose, но он не сохраняется в моей базе данных.Метод Mongoose save() не записывается в базу данных

Вот моя функция:

@User.findOne({'email': email}, (err, user) -> 
     if err? 
      callback(err) 
     else if user? 
      for account in user['accounts'] 
       if account['account_uuid'] is account_uuid 

        account.state = "Verified" 

        user.save((err, updated_user, numberTouched) -> 
         if err? 
          console.log err 
          return callback(err) 
         else 
          console.log 'Successfully verified account' 
          console.log updated_user 

          return callback(null, 'Successfully verified account') 
        ) 
        return       
      callback(new Error('No account for account_uuid')) 
    ) 

Действительно расстраивает то, что updated_user возвращается с account.state атрибут будучи «Проверенный» и в numberTouched переменной возвращается как 1, что означает 1 документ был затронут сохранение. Но когда я проверяю документ пользователя в своем БД, он по-прежнему остается значением по умолчанию «Ожидание».

Любые мысли?

P.S. Я использую базу данных разработки с MongoLab. Но я не думаю, что проблема с ними, так как я могу обновить другие атрибуты просто отлично.

+0

Имеет ли ваша подсхема атрибут id? – Loourr

+2

Ах, нет. Добавив одно исправленное! –

+1

Я не могу справиться с молчанием мангуста ... –

ответ

-1

В линии вы кладете

for account in user['accounts'] 

вы создаете новую переменную, независимо от экземпляра модели пользователя. Вы можете использовать эту переменную для отображения данных (например, через REST API), но не для изменения экземпляра модели пользователя. ака. Вы изменяете другую переменную.

Вместо этого попробуйте изменить пользователя, который вы получаете от запроса findOne(), и сохраните его.

3

Предполагая, что вы изменяете субдокумент смешанного типа, вам нужно позвонить user.markModified('accounts'), чтобы Mongoose знал, что было изменено перед сохранением.

Однако, если две из этих операций происходят одновременно, вы можете потерять данные. Я бы рекомендовал вам использовать команду findAndModify в сочетании с операторами $elemMatch и $set.

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