Wie konvertiere ich einen pymongo.cursor.Cursor in ein Diktat?


72

Ich benutze Pymongo, um alle Elemente in einer Region abzufragen (eigentlich ist es, um alle Veranstaltungsorte in einer Region auf einer Karte abzufragen). Ich habe db.command(SON())vorher in einer sphärischen Region gesucht, die mir ein Wörterbuch zurückgeben kann, und im Wörterbuch gibt es einen Schlüssel namens, resultsder die Veranstaltungsorte enthält. Jetzt muss ich in einem quadratischen Bereich suchen und es wird mir empfohlen, dies zu verwenden db.places.find. Dies gibt mir jedoch eine pymongo.cursor.CursorKlasse zurück und ich habe keine Ahnung, wie ich die Ergebnisse des Veranstaltungsortes daraus extrahieren kann.

Weiß jemand, ob ich den Cursor in ein Diktat konvertieren und die Ergebnisse extrahieren oder eine andere Methode verwenden soll, um Elemente in einem quadratischen Bereich abzufragen? Übrigens ist db die Klasse pymongo.database.Database

Die Codes sind:

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

Ich habe Werte von ll_lng, ll_lat, ur_lng und ur_lat, benutze diese Werte, aber es wird nichts aus diesen Codes gedruckt


1
Sie können den zurückgegebenen Pymongo-Cursor genauso behandeln wie eine Liste von Wörterbüchern.
Dursk

2
@dursk Sie können den Cursor jedoch nur einmal durchlaufen, bevor der Cursor zerstört wird. Sie müssen daher sicherstellen, dass jedes Ergebnis in einer Liste von Diktaten gespeichert wird.
Rohmer

Antworten:


75

Die findMethode gibt eine CursorInstanz zurück, mit der Sie alle übereinstimmenden Dokumente durchlaufen können.

Um das erste Dokument zu erhalten, das den angegebenen Kriterien entspricht, müssen Sie es verwenden find_one. Das Ergebnis find_oneist ein Wörterbuch.

Sie können jederzeit den listKonstruktor verwenden, um eine Liste aller Dokumente in der Sammlung zurückzugeben. Beachten Sie jedoch, dass dadurch alle Daten in den Speicher geladen werden und möglicherweise nicht Ihren Wünschen entsprechen.

Sie sollten dies tun, wenn Sie den Cursor wiederverwenden müssen und einen guten Grund haben, ihn nicht zu verwenden rewind()


Demo mit 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 mit find_one:

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

3
+1 Sie können immer den Listenkonstruktor verwenden ... das war ein Lebensretter. Kein Dokument erwähnte etwas darüber ...
Romeo Sierra

59

Einfach

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

Los geht's


Genius! Vielen Dank!!
Gs.

10

Ich schlage vor, eine Liste zu erstellen und ein Wörterbuch daran anzuhängen.

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

Jetzt ist x eine Liste von Wörterbüchern, die Sie auf übliche Python-Weise bearbeiten können.


4
Kann dies nicht auf [x für x in db.dbname.find ()] gekürzt werden?
jimm101

1

Die MongoDB- findMethode gibt kein einzelnes Ergebnis zurück, sondern eine Liste der Ergebnisse in Form von a Cursor. Letzteres ist ein Iterator, sodass Sie ihn mit einer forSchleife durchlaufen können .

Verwenden Sie für Ihren Fall einfach die findOneMethode anstelle von find. Dadurch erhalten Sie ein einzelnes Dokument als Wörterbuch zurück.


Ich versuche , ein besseres visuelles Verständnis zu bekommen , was find()und find_one()Ergebnisse aussehen, so zu klären, ist die endgültige Antwort , dass: a Cursora listvon dictsdenen eine Liste von passenden Dokumente aus der Datenbank repräsentiert? Beispiel: cursor = [{"_id" : ObjectId("xxxx"),"tokens" : [ "Python", "Programming"],"area" : "Programming","title" : "Python"},{"_id" : ObjectId("xxxx"),"tokens" : [ "C#", "Programming"],"area" : "Programming","title" : "C#"}]Wo auf Werte nur durch Iteration find_one()zugegriffen werden kann , während auf Werte aus einem Dokument über die Klammernotation zugegriffen wird?
user1063287

Für diejenigen, die suchen, gibt es hier eine Antwort, die auch ein detaillierteres Beispiel gibt: stackoverflow.com/a/28970776/1063287
user1063287

0

Die Kartenfunktion ist eine schnelle Möglichkeit, große Sammlungen zu konvertieren

from time import time


cursor = db.collection.find()

def f(x):
    return x['name']

t1 = time()
blackset = set(map(f, cursor))
print(time() - t1)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.