我试图使用下面的代码使用电动机和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我得到了一些中间对象(你更新了吗?)以后就没有了。
我好像应该做点“承诺”之类的事。有什么想法吗?
大家好!
发布于 2014-01-14 14:43:15
就这么做吧:
@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)见“更新”文档。
首先,您希望使用$set更新文档中的单个字段。更新代码只将整个文档替换为{“status”:status},删除任何其他字段。我显示的代码只设置“STATUS”字段,而文档的其余部分则保持不变。另外,如果项目‘_id’已经是一个ObjectId,那么对它调用ObjectId()没有任何作用;这是不必要的。
您不需要找到文档,然后更新它,然后保存它。只需发布一个“更新”。文档在MongoDB中立即更新。
“update”的返回值不是更新的文档。返回值是有关操作的一些信息,如'updatedExisting‘和'n’。
在我展示的代码中,您可以在更新文档之后找到它,这样您就可以看到更新的效果。但这也是不必要的;一旦完成此操作,您应该删除对find_one的调用。我只需检查result.get('n') == 1,然后返回True。
(最后,检查一下:您有一个关于'PID‘的唯一索引,对吗?)
https://stackoverflow.com/questions/21114325
复制相似问题