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

4 投票
4 回答
6377 浏览
提问于 2025-04-15 19:49

我觉得在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是一个新功能。

撰写回答