pymongo: findandmodify - "нет такой команды" возвращается - PullRequest
3 голосов
/ 28 февраля 2010

Я считаю, что в 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 ]

6 голосов
/ 28 февраля 2010

Для языков, которые не имеют встроенного сортированного типа dict, драйверы Монго включают один. В python это тип SON: http://api.mongodb.org/python/1.4%2B/api/pymongo/son.html. Вам нужно будет использовать это для всех команд.

Если это не помогло, убедитесь, что вы используете последнюю версию базы данных, так как findandmodify - это новая функция.

3 голосов
/ 05 июня 2011

текущий API Pymongo имеет встроенную функцию find_and_modify увидеть больше на https://github.com/mongodb/mongo-python-driver/blob/master/pymongo/collection.py#L1035

2 голосов
/ 28 февраля 2010

Одним из способов может быть создание версии команды на JavaScript и передача ее в db.eval ().

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

Проблема в том, что, как упоминал Алекс, у Python-диктов нет порядка, поэтому вам нужно будет более или менее собрать строку вручную.

1 голос
/ 21 февраля 2012

См. Документацию PyMongo:

Обратите внимание, что порядок ключей в командном документе является значительным ( «Глагол» должен стоять первым), поэтому команды, для которых требуется несколько ключей (например, findandmodify) должен использовать экземпляр SON или строку и kwargs вместо Python dict.

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

...