Как преобразовать pymongo.указатель.Курсор в дикт?
я использую pymongo для запроса всех элементов в регионе (на самом деле это запрос для всех мест в регионе на карте). Я использовал db.command(SON())
прежде чем искать в сферической области, которая может вернуть мне словарь, а в словаре есть ключ, называемый results
который содержит места проведения. Теперь мне нужно искать в квадратной области, и мне предлагается использовать db.places.find
, однако, это возвращает меня pymongo.cursor.Cursor
класс, а я понятия не имею, как извлечь результаты из него.
тут кто-нибудь знает, должен ли я преобразовать курсор в dict и извлечения результатов, или использовать другой метод для запроса элементов в квадратной области? Кстати, db - это pymongo.база данных.Класс базы данных
код:
>>> 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)
у меня есть значения ll_lng, ll_lat, ur_lng и ur_lat, используйте эти значения, но он ничего не печатает из этого кода
5 ответов
на find
метод возвращает Cursor
экземпляр, который позволяет перебирать все соответствующие документы.
чтобы получить первый документ, который соответствует заданным критериям, вам нужно использовать find_one
. Результат find_one
словарь.
вы всегда можете использовать list
конструктор для получения списка всех документов в коллекции, но имейте в виду, что это позволит загрузить все данные в память и не может быть, что вы хотите.
вы должны сделать это, если вы должны использовать курсор и есть веская причина не использовать rewind()
демо с помощью 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}
демо с помощью find_one
:
>>> col.find_one()
{'a': 1, '_id': ObjectId('54ff30faadd8f30feb90268f'), 'b': 2}
легко
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
поехали
Я предлагаю создать список и добавить в него словарь.
x = []
cur = db.dbname.find()
for i in cur:
x.append(i)
print(x)
теперь x-это список словарей, вы можете манипулировать тем же самым обычным способом python.
К MongoDB find
метод не возвращает один результат, а список результатов в виде Cursor
. Этот последний является итератором, поэтому вы можете пройти через него с for
петли.
для вашего случая просто используйте findOne
вместо find
. Это возвращает вам один документ в виде словаря.
to_dict() Преобразование документа SON в обычный экземпляр словаря Python.
Это сложнее, чем просто dict(...), потому что он должен быть рекурсивным.