2015-03-10 33 views
21

Sto usando pymongo per richiedere tutti gli elementi in una regione (in realtà si tratta di interrogare tutte le sedi in una regione su una mappa). Ho usato db.command(SON()) prima di cercare in una regione sferica, che può restituirmi un dizionario e nel dizionario c'è una chiave chiamata results che contiene le sedi. Ora ho bisogno di cercare in un'area quadrata e mi viene suggerito di utilizzare db.places.find, tuttavia, questo mi restituisce una classe pymongo.cursor.Cursor e non ho idea di come estrarre i risultati della sede da esso.Come convertire un pymongo.cursor.Cursor in un dict?

Qualcuno sa se dovrei convertire il cursore in un dict ed estrarre i risultati oppure utilizzare un altro metodo per eseguire una ricerca di elementi in un'area quadrata? BTW, db è classe pymongo.database.Database

I codici sono:

>>> 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) 

ho valori di ll_lng, ll_lat, ur_lng e ur_lat, utilizzare questi valori, ma la stampa non viene da questo codici

+1

è possibile trattare il cursore pymongo che viene restituito allo stesso modo che ci si trattano un elenco di dizionari. – dursk

+2

@dursk Tuttavia, è possibile scorrere il cursore solo una volta prima che il cursore venga distrutto, quindi è necessario assicurarsi di salvare ogni risultato in un elenco di dict. – Rohmer

risposta

29

Il metodo restituisce un find restituisce un'istanza Cursor, che permette di iterare tutti i documenti corrispondenti.

Per ottenere il primo documento che corrisponde ai criteri specificati è necessario utilizzare find_one. Il risultato di find_one è un dizionario.

È sempre possibile utilizzare il costruttore list per restituire un elenco di tutti i documenti della raccolta ma tenere presente che questo caricherà tutti i dati in memoria e potrebbe non essere ciò che si desidera.

Si dovrebbe fare che se avete bisogno di riutilizzare il cursore e hanno un buon motivo per non usare rewind()


Demo utilizzando 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} 

Demo utilizzando find_one:

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

Il metodo MongoDB find non restituisce un singolo risultato, ma un elenco di risultati sotto forma di Cursor. Quest'ultimo è un iteratore, quindi puoi passarlo attraverso un ciclo for.

Per il tuo caso, utilizzare il metodo findOne anziché find. Questo ti restituirà un singolo documento come dizionario.

+0

Sto cercando di ottenere una migliore comprensione visiva di ciò che i risultati di 'find()' e 'find_one() 'sembrano, quindi per chiarire, è la risposta definitiva che: un' Cursore' è un 'elenco' di' dicts' che rappresenta un elenco di documenti corrispondenti dal database? es .: 'cursor = [{" _id ": ObjectId (" xxxx ")," token ": [" Python "," Programming "]," area ":" Programming "," title ":" Python "}, { "_id": ObjectId ("xxxx"), "token": ["C#", "Programmazione"], "area": ​​"Programmazione", "titolo": "C#"}] 'dove i valori sono accessibili solo tramite l'iterazione , mentre i valori di find_one() 'da 1 doc sono accessibili attraverso la notazione della parentesi? – user1063287

+0

In realtà, per chi guarda, c'è una risposta qui che fornisce un esempio più dettagliato: http://stackoverflow.com/a/28970776/1063287 – user1063287

2

Suggerisco di creare un elenco e aggiungere un dizionario.

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

Ora x è un elenco di dizionario, è possibile manipolare lo stesso nel solito modo di Python.

+0

sì, l'ho capito !! Thanls – gladys0313

+1

Non può essere abbreviato in [x per x in db.dbname.find()]? – jimm101

18

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 

ci si va

Problemi correlati