2014-06-06 6 views
0

J'utilise avec succès PyMongo pour se connecter et requête (ou plutôt find()) documents dans ma collection MongoDB.Comment convertir une requête MongoDB find() vers un dictionnaire PyMongo?

Cependant, je rencontre un problème. Utilisation de l'interface MongoDB, je peux exécuter la commande:

db.mycollection.find({ $and: [{filename: {$regex: '\\.part_of_my_name'} }, {bases: {$gt: 10000 } } ] }) 

Et il fonctionne très bien. Toutefois, lorsque j'essaie d'exécuter cette commande dans PyMongo, je vois que la déclaration PyMongo pour find() nécessite un objet Python dict uniquement. En fait, il déclenche une exception si une chaîne est fournie.

Donc ma question est: comment puis-je convertir la chaîne JSON (?) Ci-dessus dans un dictionnaire?

J'ai essayé de le construire manuellement, mais c'est trop compliqué, et je me demande s'il existe un moyen simple d'aller de la chaîne au dictionnaire.

Répondre

3

Pour passer d'une chaîne à un dictionnaire, vous pouvez utiliser json.loads:

>>> import json 
>>> json.loads('{"key":"value"}') 
{'key': 'value'} 

Cependant, vous ne pouvez pas toujours copier et coller une commande MongoDB et attendre que ce soit JSON valide. Par exemple:

>>> json.loads('{$and: [{filename: {$regex: "\\.part_of_my_name"} }, {bases: {$gt: 10000 }}]}') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 338, in loads 
    return _default_decoder.decode(s) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 365, in decode 
    obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 381, in raw_decode 
    obj, end = self.scan_once(s, idx) 
ValueError: Expecting property name: line 1 column 2 (char 1) 

Pour que cela fonctionne en Python, toutes les clés doivent être explicitement cité. Donc $and doit devenir "$and". En outre, vous devrez utiliser des échappements supplémentaires pour les barres obliques inverses (un peu moche, je sais).

La requête dans votre exemple devrait ressembler à ceci:

jsonString = '{"$and":[{"filename":{"$regex":"\\\\.part_of_my_name"}},{"bases":{"$gt":10000}}]}' 

Vous pouvez ensuite utiliser json.loads dessus. Cependant, à ce stade, il s'agit d'un dictionnaire Python valide, donc vous pouvez simplement utiliser ceci:

jsonDict = {"$and":[{"filename":{"$regex":"\\.part_of_my_name"}},{"bases":{"$gt":10000}}]} 
Questions connexes