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? Pythondict
s 没有内在顺序,因此您对“第一”和“第二”的评论在 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 - 返回“没有这样的命令”的主要内容,如果未能解决你的问题,请参考以下文章
Mongodb update() 与 findAndModify() 性能对比