Python 如何将pymongo.cursor.cursor转换为dict?
我使用pymongo查询一个地区的所有项目(实际上是在地图上查询一个地区的所有场馆)。我之前使用了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并提取结果,还是使用另一种方法查询正方形区域中的项目吗? 顺便说一句
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)