【问题标题】:pymongo: findandmodify - "no such command" is returnedpymongo:findandmodify - 返回“没有这样的命令”
【发布时间】:2011-01-21 22:57:02
【问题描述】:

我相信 pymongo(或者至少是文档)中存在一个错误,导致无法运行 findandupdate 查询。

这就是发生的事情。当我跑步时:

    result = db.command({
        'findandmodify': 'my_collection',
        'query': {'foo': 'bar'},
        'update': {'$set': {'status': 'queued'}},
    })

实际发送到服务器的查询是:

{ 'query': {'foo': 'bar'}, 'findandmodify': 'my_collection', … }

注意query 参数是第一个findandmodify第二个

但这会导致服务器崩溃:

OperationFailure: command { 'query': {'foo': 'bar'}, 'findandmodify': 'my_collection', ... } 失败:没有这样的 cmd

因为服务器希望 findandmodify 排在第一位(显然,BSON dicts 是有序的)。

有什么解决办法吗?

【问题讨论】:

  • 你运行的是什么版本的 Mongo?
  • Python dicts 没有内在顺序,因此您对“第一”和“第二”的评论在 Python 语言的上下文中完全是一派胡言。请澄清!
  • @Alex 是的,这就是问题所在:Python 的 dicts 是无序的,但(显然)BSON dicts(它们被称为 dicts 吗?)是。
  • 不知道 BSON。在与 Javascript 规范匹配的 JSON 中,对象(相当于字典,除了键必须是特定的字符串)是 not 有序的。
  • 好的,所以 MongoDB 文档 (mongodb.org/display/DOCS/BSON) 对此事并不完全清楚……但维基百科 (en.wikipedia.org/wiki/BSON) 建议 BSON 对象是有序的,Mongo 实现似乎建议一样。

标签: python mongodb pymongo


【解决方案1】:

对于没有内置排序字典类型的语言,mongo 驱动程序包括一个。在 python 中是 SON 类型:http://api.mongodb.org/python/1.4%2B/api/pymongo/son.html。您需要将它用于所有命令。

如果仍然失败,请确保您使用的是最新版本的数据库,因为 findandmodify 是一项新功能。

【解决方案2】:

当前 pymongo api 内置了 find_and_modify 更多信息请访问https://github.com/mongodb/mongo-python-driver/blob/master/pymongo/collection.py#L1035

【解决方案3】:

一种解决方法可能是构建命令的 JavaScript 版本并将其传递给 db.eval()。

db.eval('db.runCommand({"findandmodify": "my_collection", "query": {"foo": "bar"}, "update": {"$set": {"status": "queued"}},})')

问题在于,正如 Alex 所说,Python dicts 没有顺序,因此您需要或多或少地手动构建字符串。

【讨论】:

  • Javascript 对象也没有内在顺序(根据语言标准,尽管特定的 JS 实现当然可以随意添加任意顺序——关键是,不能保证!)。
  • jS 标准说顺序是未定义的,但大多数实现保留了您向对象添加元素的顺序。无论哪种情况,这个示例都可以在 Mongo 的解释器中正常工作。
【解决方案4】:

参见 PyMongo 文档:

注意命令文档中键的顺序很重要( “动词”必须先出现),因此需要多个键的命令(例如 findandmodify) 应该使用 SON 的实例或字符串和 kwargs 而不是 Python 字典。

http://api.mongodb.org/python/2.1/api/pymongo/database.html

【讨论】:

    猜你喜欢
    • 2017-03-04
    • 2017-04-12
    • 2020-02-07
    • 1970-01-01
    • 1970-01-01
    • 2020-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多