【问题标题】:update mongodb with tornadoweb and motor driver使用 tornadoweb 和电机驱动程序更新 mongodb
【发布时间】:2014-01-14 13:06:37
【问题描述】:

我正在尝试在 mongodb 上执行更新,使用 motor 和 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 ?),稍后没有。

我似乎应该做一些'提交'左右。有什么想法吗?

你好!

【问题讨论】:

    标签: python mongodb tornado tornado-motor


    【解决方案1】:

    这样做:

    @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} 替换整个文档,删除任何其他字段。我展示的代码只是设置了“状态”字段,而文档的其余部分保持不变。此外,如果 project['_id'] 已经是 ObjectId,则对其调用 ObjectId() 无效;没必要。

    您不需要找到文档,然后更新它,然后保存它。只需发出“更新”。该文档会立即在 MongoDB 中更新。

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

    在我展示的代码中,你可以找到更新后的文档,可以看到更新的效果。但这也是不必要的;一旦你有这个工作,你应该删除对 find_one 的调用。我只需检查 result.get('n') == 1 然后返回 True。

    (最后,只是检查一下:您在 'PID' 上有一个唯一索引,对吗?)

    【讨论】:

    • 感谢您的全面回答。阅读文档总是被遗忘的优势。在代码中进行指定更改后,功能正常工作。 1. 由于调试原因,原来的函数长的很奇怪。 2. 是的,我确保这个集合的 PID 上的唯一索引。 3. 谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-16
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    相关资源
    最近更新 更多