pymongo:findandmodify - 返回“no such command”

时间:2010-02-28 05:54:22

标签: python mongodb pymongo

我相信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 dicts是有序的)。

有没有解决这个问题?

4 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:3)

目前pymongo api内置了find_and_modify 在https://github.com/mongodb/mongo-python-driver/blob/master/pymongo/collection.py#L1035

了解详情

答案 2 :(得分:2)

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

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

问题在于,正如Alex所说,Python dicts没有订单,所以你需要手动或多或少地构建字符串。

答案 3 :(得分:1)

请参阅PyMongo文档:

  

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

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