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?

¿Fue útil?

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top