4

我相信 pymongo (或者至少是文档)中存在一个错误,导致无法运行findandupdate查询。

这就是发生的事情。当我运行时:

    result = db.command({
        'findandmodify': 'my_collection',
        'query': {'foo': 'bar'},
        'update': {'$set': {'status': 'queued'}},
    })

实际发送到服务器的查询是:

{ 'query': {'foo': 'bar'}, 'findandmodify': 'my_collection', … }

请注意,query参数是first,并且findandmodifysecond

但这会导致服务器抛出:

OperationFailure: command { 'query': {'foo': 'bar'}, 'findandmodify': 'my_collection', ... } failed: no such cmd

因为服务器希望findandmodify是第一个(显然,BSON dicts 是有序的)。

有什么解决方法吗?

4

4 回答 4

6

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

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

于 2010-02-28T15:38:40.917 回答
3

当前的 pymongo api 有 find_and_modify 内置在https://github.com/mongodb/mongo-python-driver/blob/master/pymongo/collection.py#L1035查看更多

于 2011-06-05T04:35:00.060 回答
2

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

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

问题在于,正如 Alex 所提到的,Python dicts 没有顺序,因此您将需要或多或少地手动构建字符串。

于 2010-02-28T06:50:15.237 回答
1

请参阅 PyMongo 文档:

请注意命令文档中键的顺序很重要(“动词”必须在前),因此需要多个键的命令(例如 findandmodify)应该使用 SON 实例或字符串和 kwargs 而不是 Python dict。

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

于 2012-02-21T19:48:37.593 回答