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


72

我正在使用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的值,使用这些值,但是此代码中什么都不会打印


1
您可以使用与处理字典列表相同的方式来处理返回的pymongo游标。
dursk 2015年

2
@dursk但是您只能在销毁光标之前在光标中循环一次,因此您需要确保将每个结果保存在字典列表中。
罗默2013年

Answers:


75

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}

3
+1您可以随时使用列表构造函数...这可以节省生命。没有文件提及此事……
罗密欧·塞拉


10

我建议创建一个列表并将字典附加到其中。

x   = []
cur = db.dbname.find()
for i in cur:
    x.append(i)
print(x)

现在x是一个字典列表,您可以用通常的python方式进行操作。


4
难道不能将其缩短为[db.dbname.find()中x的x]吗?
jimm101

1

MongoDBfind方法不返回单个结果,而是以形式出现的结果列表Cursor。后者是一个迭代器,因此您可以for循环使用它。

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


我试图得到什么更好的视觉认识find()find_one()成果的样子,所以要澄清,是明确的答案是:一个Cursor是一个listdicts代表从数据库匹配的文档的列表?例如: cursor = [{"_id" : ObjectId("xxxx"),"tokens" : [ "Python", "Programming"],"area" : "Programming","title" : "Python"},{"_id" : ObjectId("xxxx"),"tokens" : [ "C#", "Programming"],"area" : "Programming","title" : "C#"}]其中值只能通过迭代访问,而find_one()1文档中的值则通过括号表示法访问?
user1063287 '16

实际上,对于那些寻找的人来说,这里也有一个给出更详细示例的答案: stackoverflow.com/a/28970776/1063287
user1063287

0

地图功能是转换大集合的快速方法

from time import time


cursor = db.collection.find()

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.