Question

Je crois qu'il ya un bogue dans pymongo (ou, au moins, la documentation) qui rend impossible d'exécuter une requête findandupdate.

Voici ce qui se passe. Quand je lance:

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

La requête qui obtient effectivement envoyé au serveur est:

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

Notez que l'argument est query premier , et findandmodify est secondes .

Mais cela provoque le serveur de vomir:

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

Le serveur attend findandmodify être le premier (dicts BSON sont, apparemment, commandés).

Y at-il travail autour de cela?

Était-ce utile?

La solution

Pour les langues qui ne disposent pas d'un type dict intégré Sorted les pilotes mongo comprennent un. En python qui est le type de SON: http: //api.mongodb .org / python / 1,4% 2B / api / pymongo / son.html . Vous devrez l'utiliser pour toutes les commandes.

Si cela échoue encore assurez-vous que vous utilisez la dernière version de la base de données findandmodify est une nouvelle fonctionnalité.

Autres conseils

Une solution peut être de construire la version JavaScript de la commande et le transmettre à db.eval ().

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

Le problème est que, comme Alex mentionné, dicts Python ont pas d'ordre, vous aurez besoin de construire la chaîne plus ou moins manuellement.

Voir la documentation PyMongo:

  

Notez l'ordre des clés dans le document de commande est importante (la   « Verbe » doit venir en premier), de sorte que les commandes qui nécessitent plusieurs touches (par exemple,   findandmodify) doivent utiliser une instance de fils ou une chaîne et kwargs   au lieu d'un dict Python.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top