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字典是有顺序的)。
有没有什么解决办法呢?
4 个回答
2
一个解决办法可能是构造这个命令的JavaScript版本,然后把它传给db.eval()。
db.eval('db.runCommand({"findandmodify": "my_collection", "query": {"foo": "bar"}, "update": {"$set": {"status": "queued"}},})')
问题在于,正如Alex提到的,Python中的字典是没有顺序的,所以你需要手动大致构建这个字符串。
3
现在的pymongo接口里有一个叫做find_and_modify的功能,已经内置在里面了。想了解更多,可以查看这个链接:https://github.com/mongodb/mongo-python-driver/blob/master/pymongo/collection.py#L1035
6
对于那些没有内置排序字典类型的编程语言,MongoDB的驱动程序里提供了一个。对于Python来说,这个类型叫做SON:http://api.mongodb.org/python/1.4%2B/api/pymongo/son.html。你在执行所有命令时都需要使用这个类型。
如果还是不行,确保你使用的是最新版本的数据库,因为findandmodify是一个新功能。