Как преобразовать pymongo.cursor.Cursor в dict?
Я использую pymongo для запроса всех элементов в регионе (на самом деле это запрос для всех мест в регионе на карте). Раньше я использовал db.command(SON())
для поиска в сферической области, которая может вернуть мне словарь, а в словаре есть клавиша results
, которая содержит места. Теперь мне нужно искать в квадратной области, и мне предлагается использовать db.places.find
, однако это возвращает мне класс pymongo.cursor.Cursor
, и я не знаю, как извлечь из него результаты встречи.
Кто-нибудь знает, должен ли я преобразовать курсор в dict и извлечь результаты или использовать другой метод для запроса элементов в квадратной области?
BTW, db - pymongo.database.Database class
Коды:
>>> 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, используйте эти значения, но он ничего не печатает из этих кодов.
Ответы
Ответ 1
Метод find
возвращает a 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}
Ответ 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
Там вы идете
Ответ 3
Я предлагаю создать список и добавить в него словарь.
x = []
cur = db.dbname.find()
for i in cur:
x.append(i)
print(x)
Теперь x - это список словарей, вы можете манипулировать их обычным образом python.
Ответ 4
Метод MongoDB find
не возвращает ни одного результата, а список результатов в форме Cursor
. Это последний итератор, поэтому вы можете пройти через цикл for
.
В вашем случае используйте метод findOne
вместо find
. Это вернет вам один документ в качестве словаря.
Ответ 5
to_dict()
Преобразуйте документ SON в обычный экземпляр словаря Python.
Это сложнее, чем просто dict (...), потому что он должен быть рекурсивным.
http://api.mongodb.org/python/current/api/bson/son.html