Python 如何将pymongo.cursor.cursor转换为dict?

Python 如何将pymongo.cursor.cursor转换为dict?,python,mongodb,dictionary,mongodb-query,pymongo,Python,Mongodb,Dictionary,Mongodb Query,Pymongo,我使用pymongo查询一个地区的所有项目(实际上是在地图上查询一个地区的所有场馆)。我之前使用了db.command(SON())在一个球形区域中进行搜索,该区域可以返回一个字典,字典中有一个名为results的键,其中包含场地。现在我需要搜索一个正方形区域,建议我使用db.places.find,但是,这会返回一个pymongo.cursor.cursor类,我不知道如何从中提取场地结果 有人知道我是应该将光标转换为dict并提取结果,还是使用另一种方法查询正方形区域中的项目吗? 顺便说一句

我使用pymongo查询一个地区的所有项目(实际上是在地图上查询一个地区的所有场馆)。我之前使用了
db.command(SON())
在一个球形区域中进行搜索,该区域可以返回一个字典,字典中有一个名为
results
的键,其中包含场地。现在我需要搜索一个正方形区域,建议我使用
db.places.find
,但是,这会返回一个
pymongo.cursor.cursor
类,我不知道如何从中提取场地结果

有人知道我是应该将光标转换为dict并提取结果,还是使用另一种方法查询正方形区域中的项目吗? 顺便说一句,db是pymongo.database.database类

代码为:

>>> 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的值,使用这些值,但它不会从这些代码中打印任何内容

MongoDB
find
方法不会返回单个结果,而是以
光标的形式返回结果列表。后者是一个迭代器,因此您可以使用
for
循环遍历它

对于您的情况,只需使用
findOne
方法,而不是
find
。这将返回一个文档作为字典。

到dict() 将子文档转换为普通Python字典实例

这比dict(…)更复杂,因为它需要递归

该方法返回一个实例,允许您迭代所有匹配的文档

要获取与给定条件匹配的第一个文档,您需要使用。
find_one
的结果是一本字典

您可以始终使用
list
构造函数返回集合中所有文档的列表,但请记住,这将加载内存中的所有数据,可能不是您想要的

如果您需要重用游标并且有充分的理由不使用它,那么应该这样做


使用
查找
进行演示:

>>> 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}

我建议创建一个列表并在其中添加字典

x   = []
cur = db.dbname.find()
for i in cur:
    x.append(i)
print(x)
现在,x是一个字典列表,您可以用python常用的方式来操作它。

简单

导入pymongo
conn=pymongo.MongoClient()
db=conn.test#test是我的数据库
col=db.spam#这里是我的收藏
数组=列表(col.find())
打印(数组)

现在你可以开始了

地图功能是转换大型收藏的快速方法

from time import time


cursor = db.collection.find()

def f(x):
    return x['name']

t1 = time()
blackset = set(map(f, cursor))
print(time() - t1)

您可以像处理字典列表一样处理返回的pymongo游标。@dursk但在游标被销毁之前,您只能循环遍历游标一次,因此您需要确保将每个结果保存在一个dict列表中。我正在尝试更好地从视觉上理解什么是
find()
find_one()
结果看起来像是,因此要澄清的是,确定的答案是:
光标
目录的
列表
,它表示数据库中匹配文档的列表?例如:
cursor=[{“\u id”:ObjectId(“xxxx”),“tokens”:[“Python”,“Programming”],“area”:“Programming”,“title”:“Programming”,“title”:“Python”},{“\u id”:ObjectId(“xxxx”),“tokens”:[“C#”,“Programming”],“area”:“Programming”,“title”:“C#“}]
其中的值只能通过迭代访问,而
find#one()
1个文档中的值是通过括号表示法访问的?实际上,对于那些正在查看的人来说,这里有一个答案也给出了一个更详细的示例:这不能缩短为[x for x in db.dbname.find()]?在光标上调用
to_dict()
实际上不起作用。+1您可以始终使用列表构造函数。。。这是一个救命稻草。没有任何文件提到这个…天才!非常感谢。
from time import time


cursor = db.collection.find()

def f(x):
    return x['name']

t1 = time()
blackset = set(map(f, cursor))
print(time() - t1)