2014-01-14 2 views
0

Я пытаюсь perfom обновления на MongoDB, используя двигатель и tornadoweb со следующим кодом:обновление MongoDB с tornadoweb и двигателя водитель

@gen.coroutine 
def set_project_status(self, pid, status): 
    try: 
     project = yield motor.Op(self.db[S.DB_PROJECT_TABLE].find_one, {'PID': pid}) 
     logging.debug('set_project_status old_id {0}'.format(project['_id'])) 

     project_update = yield motor.Op(self.db[S.DB_PROJECT_TABLE].update, 
          {'_id': ObjectId(project['_id'])}, {'STATUS': status}) 

     logging.debug('set_project_status saving') 
     save = yield motor.Op(self.db[S.DB_PROJECT_TABLE].save, project_update) 
     logging.debug('set_project_status saved {0}'.format(save)) 

     logging.debug('set_project_status saved id {0}'.format(project_update)) 

     project = yield motor.Op(self.db[S.DB_PROJECT_TABLE].find_one, {'PID': pid}) 
     logging.debug('set_project_status project {0}'.format(project)) 

     raise gen.Return(True) 

    except Exception,e: 
     logging.debug('{0} {1} {2}'.format(pid, status, e)) 
     raise gen.Return(False) 

Что я получаю в журналах является:

set_project_status old_id 52d532d4b12c6478ce767a83 
set_project_status saving 
set_project_status saved 52d532d4b12c6478ce767a84 
set_project_status saved id {u'ok': 1.0, u'err': None, u'connectionId': 2052, u'n': 1, u'updatedExisting': True, '_id': ObjectId('52d532d4b12c6478ce767a84')} 
set_project_status project None 

Я получаю некоторый промежуточный объект (u'updatedExisting?) И позже.

Кажется, я должен сделать кое-какие действия. Есть идеи?

Приветствует!

ответ

2

Просто сделай это:

@gen.coroutine 
def set_project_status(self, pid, status): 
    try: 
     result = yield motor.Op(self.db[S.DB_PROJECT_TABLE].update, 
         {'PID': pid}, {'$set': {'STATUS': status}}) 

     logging.debug('update result: {0}'.format(result))   
     project = yield motor.Op(self.db[S.DB_PROJECT_TABLE].find_one, {'PID': pid}) 
     logging.debug('set_project_status project {0}'.format(project)) 
    except Exception,e: 
     logging.debug('{0} {1} {2}'.format(pid, status, e)) 
     raise gen.Return(False) 

См docs for "update".

Сначала вы хотите использовать $ set для обновления одного поля в документе. Ваш код обновления заменяет весь документ только {'STATUS': status}, удаляя любые другие поля. Код, который я показываю, просто устанавливает поле «STATUS» и оставляет остальную часть документа незатронутой. Кроме того, если проект ['_ id'] уже является ObjectId, вызов ObjectId() на нем не имеет никакого эффекта; это не нужно.

Вам не нужно искать документ, а затем обновлять его, а затем сохранять его. Просто выпустите «обновление». Документ немедленно обновляется в MongoDB.

Возвращаемое значение «обновление» не является обновленным документом. Возвращаемое значение представляет собой некоторую информацию об операции, например «updatedExisting» и «n».

В коде, который я показал, вы находите документ после его обновления, чтобы вы могли увидеть эффект от обновления. Но это тоже не нужно; вы должны удалить вызов find_one, как только вы это сделаете. Я просто проверил бы это result.get('n') == 1 и вернул бы True.

(И, наконец, просто проверить: у вас есть уникальный индекс на «PID», справа)

+1

спасибо за исчерпывающий ответ. документация для чтения всегда является забытым преимуществом. после внесения указанных изменений в код функция работает правильно. 1. Первоначальная функция была странно длинной, по причинам отладки. 2. Yeap, я гарантирую уникальный индекс в PID для этой коллекции. 3. спасибо. – user1632928

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