pymongo:findandmodify - “没有这样的命令”返回
题
相信存在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', … } failed: no such cmd
由于服务器期望findandmodify
为第一(BSON类型的字典中,很显然,订购)。
有没有解决有关此?
解决方案
对于没有该语言的内置排序字典型蒙戈驱动器包括一个。在蟒那是SON类型: HTTP://api.mongodb .ORG /蟒/ 1.4%2B / API / pymongo / son.html 。您将需要使用所有的命令。
如果还是失败,请确保您使用的是最新版本的数据库作为findandmodify是一项新功能。
其他提示
当前pymongo API具有find_and_modify内置 多见于 https://github.com/ mongodb的/蒙戈-蟒驱动器/斑点/主/ pymongo / collection.py#L1035
一种解决方法可以是构造命令的JavaScript版本并把它传递到db.eval()。
db.eval('db.runCommand({"findandmodify": "my_collection", "query": {"foo": "bar"}, "update": {"$set": {"status": "queued"}},})')
问题是,亚历克斯提到,Python的类型的字典没有顺序,因此你需要更多或更少的手动生成的字符串。
请参阅PyMongo文件:
请注意命令文件中的键的顺序是显著(该 “动词”必须先来),所以需要多个密钥命令(例如 findandmodify)应采用SON的实例,或者一个字符串,kwargs 代替Python字典。
http://api.mongodb.org/python/2.1/ API / pymongo / database.html
不隶属于 StackOverflow