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, results
der 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.Cursor
Klasse 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
quelle
Antworten:
Die
find
Methode gibt eineCursor
Instanz 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 Ergebnisfind_one
ist ein Wörterbuch.Sie können jederzeit den
list
Konstruktor 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}
quelle
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
quelle
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.
quelle
Die MongoDB-
find
Methode gibt kein einzelnes Ergebnis zurück, sondern eine Liste der Ergebnisse in Form von aCursor
. Letzteres ist ein Iterator, sodass Sie ihn mit einerfor
Schleife durchlaufen können .Verwenden Sie für Ihren Fall einfach die
findOne
Methode anstelle vonfind
. Dadurch erhalten Sie ein einzelnes Dokument als Wörterbuch zurück.quelle
find()
undfind_one()
Ergebnisse aussehen, so zu klären, ist die endgültige Antwort , dass: aCursor
alist
vondicts
denen 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 Iterationfind_one()
zugegriffen werden kann , während auf Werte aus einem Dokument über die Klammernotation zugegriffen wird?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)
quelle
to_dict () Konvertiert ein SON-Dokument in eine normale Python-Wörterbuchinstanz.
Dies ist schwieriger als nur zu diktieren (...), da es rekursiv sein muss.
http://api.mongodb.org/python/current/api/bson/son.html
quelle
to_dict()
des Cursors funktioniert nicht wirklich.