pymongo:findandmodify - 返回“没有这样的命令”

Posted

技术标签:

【中文标题】pymongo:findandmodify - 返回“没有这样的命令”【英文标题】:pymongo: findandmodify - "no such command" is returned 【发布时间】: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 实现似乎建议一样。 【参考方案1】:

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

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

【讨论】:

引用“当前(构建)”url api.mongodb.org/python/current/api/bson/son.html 现在在:github.com/mongodb/mongo-python-driver/blob/master/pymongo/…【参考方案2】:

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

【讨论】:

在github.com/mongodb/mongo-python-driver/blob/master/test/…中有例子【参考方案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

【讨论】:

以上是关于pymongo:findandmodify - 返回“没有这样的命令”的主要内容,如果未能解决你的问题,请参考以下文章

pymongo的操作

Mongodb update() 与 findAndModify() 性能对比

Mongoose 是不是支持 Mongodb `findAndModify` 方法?

findAndModify() 在猫鼬中给出异常

MongoDB findAndModify 返回 null

Mongodb 关于update和findAndModify