如何将 pymongo.cursor.Cursor 转换为字典?
Posted
技术标签:
【中文标题】如何将 pymongo.cursor.Cursor 转换为字典?【英文标题】:How to convert a pymongo.cursor.Cursor into a dict? 【发布时间】:2015-05-12 04:22:54 【问题描述】:我是用pymongo来查询一个地区的所有物品(其实是在一张地图上查询一个地区的所有场地)。我之前使用db.command(SON())
在球形区域中搜索,它可以返回一个字典,并且字典中有一个名为results
的键,其中包含场地。现在我需要在一个正方形区域中搜索,建议使用db.places.find
,但是,这会返回一个pymongo.cursor.Cursor
类,我不知道如何从中提取场地结果。
有谁知道我应该将光标转换为字典并提取结果,还是使用其他方法查询方形区域中的项目? 顺便说一句,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 的值,使用这些值但它不会从这些代码中打印任何内容
【问题讨论】:
您可以像处理字典列表一样处理返回的 pymongo 光标。 @dursk 但是您只能在光标被销毁之前循环浏览一次光标,因此您需要确保将每个结果保存在字典列表中。 【参考方案1】: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
【讨论】:
+1 你总是可以使用列表构造函数...这是一个救生员。没有任何文件提到这件事……【参考方案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 方式来操作它。
【讨论】:
这不能缩短为 [x for x in db.dbname.find()]?【参考方案4】:MongoDB find
方法不返回单个结果,而是返回Cursor
形式的结果列表。后者是一个迭代器,因此您可以使用 for
循环遍历它。
对于您的情况,只需使用findOne
方法而不是find
。这将为您返回一个作为字典的文档。
【讨论】:
我试图更好地直观理解find()
和find_one()
结果的样子,所以澄清一下,明确的答案是:Cursor
是list
dicts
代表数据库中匹配文档的列表?例如:cursor = ["_id" : ObjectId("xxxx"),"tokens" : [ "Python", "Programming"],"area" : "Programming","title" : "Python","_id" : ObjectId("xxxx"),"tokens" : [ "C#", "Programming"],"area" : "Programming","title" : "C#"]
其中的值只能通过迭代访问,而来自 1 个文档的 find_one()
值可以通过括号表示法访问?
实际上,对于那些正在寻找的人,这里有一个答案,也提供了更详细的示例:***.com/a/28970776/1063287【参考方案5】:
地图功能是转换大集合的快速方法
from time import time
cursor = db.collection.find()
def f(x):
return x['name']
t1 = time()
blackset = set(map(f, cursor))
print(time() - t1)
【讨论】:
【参考方案6】:to_dict() 将 SON 文档转换为普通的 Python 字典实例。
这比 dict(...) 更棘手,因为它需要递归。
http://api.mongodb.org/python/current/api/bson/son.html
【讨论】:
在光标上调用to_dict()
实际上不起作用。以上是关于如何将 pymongo.cursor.Cursor 转换为字典?的主要内容,如果未能解决你的问题,请参考以下文章