web-dev-qa-db-fra.com

Comment convertir un pymongo.cursor.Cursor en dict?

J'utilise pymongo pour interroger tous les éléments d'une région (il s'agit en fait d'interroger tous les sites d'une région sur une carte). J'ai déjà utilisé db.command(SON()) avant de chercher dans une région sphérique, ce qui peut me retourner un dictionnaire. Dans le dictionnaire, il existe une clé appelée results qui contient les lieux. Maintenant, j'ai besoin de chercher dans un carré et on me suggère d'utiliser db.places.find, cependant, cela me renvoie un pymongo.cursor.Cursor _ et je ne sais pas comment extraire les résultats de la salle.

Est-ce que quelqu'un sait si je dois convertir le curseur en dict et extraire les résultats, ou utiliser une autre méthode pour rechercher des éléments dans une région carrée? BTW, db est la classe pymongo.database.Database

Les codes sont:

>>> import pymongo
>>> db = pymongo.MongoClient(Host).PSRC 
>>> resp = db.places.find({"loc": {"$within": {"$box": [[ll_lng,ll_lat], [ur_lng,ur_lat]]}}})
>>> for doc in resp:
>>>     print(doc)

J'ai les valeurs de ll_lng, ll_lat, ur_lng et ur_lat, j'utilise ces valeurs, mais rien n'est imprimé à partir de ces codes

44
gladys0313

La méthode find renvoie une instance Cursor , qui vous permet de parcourir tous les documents correspondants.

Pour obtenir le premier document qui correspond aux critères donnés, vous devez utiliser find_one . Le résultat de find_one Est un dictionnaire.

Vous pouvez toujours utiliser le constructeur list pour renvoyer une liste de tous les documents de la collection, mais gardez à l'esprit que cela chargera toutes les données en mémoire et risque de ne pas correspondre à vos souhaits.

Vous devriez le faire si vous avez besoin de réutiliser le curseur et avez une bonne raison de ne pas utiliser rewind()


Démo utilisant find:

>>> import pymongo
>>> conn = pymongo.MongoClient()
>>> db = conn.test #test is my database
>>> col = db.spam #Here spam is my collection
>>> cur = col.find()  
>>> cur
<pymongo.cursor.Cursor object at 0xb6d447ec>
>>> for doc in cur:
...     print(doc)  # or do something with the document
... 
{'a': 1, '_id': ObjectId('54ff30faadd8f30feb90268f'), 'b': 2}
{'a': 1, 'c': 3, '_id': ObjectId('54ff32a2add8f30feb902690'), 'b': 2}

Démo utilisant find_one:

>>> col.find_one()
{'a': 1, '_id': ObjectId('54ff30faadd8f30feb90268f'), 'b': 2}
49
styvane

Facile

import pymongo
conn = pymongo.MongoClient()
db = conn.test #test is my database
col = db.spam #Here spam is my collection
array = list(col.find())

print array

Voilà

30
Aminah Nuraini

Je suggère de créer une liste et d'y ajouter un dictionnaire.

x   = []
cur = db.dbname.find()
for i in cur:
    x.append(i)
print(x)

Maintenant, x est une liste de dictionnaire, vous pouvez manipuler la même chose de la manière habituelle python.

7

La méthode MongoDB find ne renvoie pas un seul résultat, mais une liste de résultats sous la forme d'un Cursor. Ce dernier est un itérateur, vous pouvez donc le parcourir avec une boucle for.

Dans votre cas, utilisez simplement la méthode findOne à la place de find. Cela vous retournera un seul document sous forme de dictionnaire.

1
Alexandre