2014-01-14 70 views
0

我想perfom有關MongoDB更新,使用電機和tornadoweb用下面的代碼:更新的MongoDB

@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?),之後沒有。

我看起來像我應該做一些'commit'or所以。有任何想法嗎?

迎接!

回答

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'字段並且保持文檔的其餘部分不變。另外,如果project ['_ id']已經是一個ObjectId,那麼調用ObjectId()就沒有效果;這是沒有必要的。

您不需要找到文檔,然後更新它,然後保存它。只需發佈「更新」。該文檔在MongoDB中立即更新。

'update'的返回值不是更新的文檔。返回值是關於操作的一些信息,例如'updatedExisting'和'n'。

在我展示的代碼中,您可以在更新文檔後找到該文檔,以便您可以看到更新的效果。但這也是不必要的。一旦你有這個工作,你應該刪除調用find_one。我只是檢查result.get('n') == 1,然後返回True。

(最後,只是爲了檢查:你對「PID」唯一索引,右)

+1

感謝您的全面的答案。閱讀文檔總是被遺忘的優勢。在代碼中指出更改後,功能正常工作。由於調試原因,原始函數奇怪地很長。 2. Yeap,我確保在這個集合的PID上有一個唯一的索引。 3.謝謝。 – user1632928