pymongo: findandmodify - “no hay tal orden” se devuelve
Pregunta
Creo que hay un error en pymongo (o, al menos, la documentación), que hace que sea imposible ejecutar una consulta findandupdate
.
Esto es lo que sucede. Cuando corro:
result = db.command({
'findandmodify': 'my_collection',
'query': {'foo': 'bar'},
'update': {'$set': {'status': 'queued'}},
})
La consulta que realmente se envía al servidor es:
{ 'query': {'foo': 'bar'}, 'findandmodify': 'my_collection', … }
Tenga en cuenta que el argumento es query
primero , y findandmodify
es segundo .
Pero esto hace que el servidor de vomitar:
OperationFailure: command { 'query': {'foo': 'bar'}, 'findandmodify': 'my_collection', … } failed: no such cmd
Debido a que las Espera servidor findandmodify
ser primero (dicts BSON están, al parecer, clasificadas).
¿Hay alguna forma de solucionar esto?
Solución
Para los idiomas que no tienen un tipo incorporado dict ordenada los conductores incluyen uno mongo. En Python que es el tipo SON: http: //api.mongodb .org / python / 1,4% 2B / api / pymongo / son.html . Tendrá que utilizar para que todos los comandos.
Si esto sigue sin asegurarse de que está utilizando la última versión de la base de datos como findandmodify es una característica nueva.
Otros consejos
API actual pymongo ha incorporado en find_and_modify ver más en https://github.com/ mongodb / mongo-python-conductor / burbuja / maestro / pymongo / collection.py # L1035
Una solución puede ser para construir la versión de JavaScript del comando y pasarlo a db.eval ().
db.eval('db.runCommand({"findandmodify": "my_collection", "query": {"foo": "bar"}, "update": {"$set": {"status": "queued"}},})')
El problema es que, como se mencionó Alex, predice Python no tienen un orden, por lo que necesitará para crear la cadena más o menos de forma manual.
Ver documentación PyMongo:
Tenga en cuenta el orden de las claves en el documento de comandos es significativa (el “Verbo” debe venir primero), por lo que los comandos que requieren múltiples claves (por ejemplo, findandmodify) debe utilizar una instancia de hijo o una cadena y kwargs en lugar de un diccionario de Python.
http://api.mongodb.org/python/2.1/ api / pymongo / database.html