来自 pymongo 的游标列表理解
List comprehension with cursor from pymongo
这是我的 pymongo 代码:
client = MongoClient('localhost', 27017)
db = client['somedb']
collection = db.somecollection
return_obj = collection.find({"field1":"red"})
#First print statement
print([item['field1'] for item in return_obj])
#Second print statement
print([item['field1'] for item in return_obj])
第一个打印语句生成非空列表,而第二个打印语句生成空列表。好像我必须在 return_obj.
上重置索引
有什么想法吗?
这是正确的行为,应该是这样。您的变量 return_obj
是 mongoDB 游标,它是 python 中的特殊 class,如 here 所述。使用一次后,光标为"exhausted".
假设游标对象是一个指针(即迭代器),指向return_obj
中的第一项。使用列表推导式(类似于 foreach 迭代)时,您经历的每次迭代,该指针都指向返回列表中的下一项。遍历整个列表后,指针刚好指向列表的末尾。您可以将其视为 uncircular-linked-list。
因此,这个游标对象只有 one-time-use(我只是撒谎,因为你可以重置它,但这最适合你的理解)。
希望对您有所帮助。
这是我的 pymongo 代码:
client = MongoClient('localhost', 27017)
db = client['somedb']
collection = db.somecollection
return_obj = collection.find({"field1":"red"})
#First print statement
print([item['field1'] for item in return_obj])
#Second print statement
print([item['field1'] for item in return_obj])
第一个打印语句生成非空列表,而第二个打印语句生成空列表。好像我必须在 return_obj.
上重置索引有什么想法吗?
这是正确的行为,应该是这样。您的变量 return_obj
是 mongoDB 游标,它是 python 中的特殊 class,如 here 所述。使用一次后,光标为"exhausted".
假设游标对象是一个指针(即迭代器),指向return_obj
中的第一项。使用列表推导式(类似于 foreach 迭代)时,您经历的每次迭代,该指针都指向返回列表中的下一项。遍历整个列表后,指针刚好指向列表的末尾。您可以将其视为 uncircular-linked-list。
因此,这个游标对象只有 one-time-use(我只是撒谎,因为你可以重置它,但这最适合你的理解)。
希望对您有所帮助。