Как преобразовать 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(...), потому что он должен быть рекурсивным.

http://api.mongodb.org/python/current/api/bson/son.html