首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用tornadoweb和电机驱动器更新mongodb

用tornadoweb和电机驱动器更新mongodb
EN

Stack Overflow用户
提问于 2014-01-14 13:06:37
回答 1查看 609关注 0票数 0

我试图使用下面的代码使用电动机和tornadoweb对mongodb进行更新:

代码语言:javascript
复制
@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)

我在日志里得到的是:

代码语言:javascript
复制
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

我得到了一些中间对象(你更新了吗?)以后就没有了。

我好像应该做点“承诺”之类的事。有什么想法吗?

大家好!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-14 14:43:15

就这么做吧:

代码语言:javascript
复制
@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‘的唯一索引,对吗?)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21114325

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档