Подтвердить что ты не робот

Как преобразовать 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, используйте эти значения, но он ничего не печатает из этих кодов.

4b9b3361

Ответ 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