2014-01-14 68 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