如何将 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_onefind_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() 结果的样子,所以澄清一下,明确的答案是:Cursorlist 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 转换为字典?的主要内容,如果未能解决你的问题,请参考以下文章

如何将thinkcmf导入eclipse

如何将CString转换成wstring

如何将Ios文件上传到

Qt如何将文字变成图片?

如何将Bitmap保存为本地图片文件?

在MATLAB中如何将图导出