迭代MongoDB游标返回空结果?Python PyMongo使用疑问
问题原因与解决办法
这不是PyMongo的Bug,是其游标特性导致的。PyMongo中find()返回的游标是一次性迭代对象——游标会从数据库逐条拉取数据,一旦遍历完毕(比如第一次用字典推导式遍历query_results),游标指针就会停在结果集末尾,后续再遍历同一个游标时,已经没有数据可读取了。
如果你的代码里两个字典都为空,大概率是在执行这两段推导式之前,已经对query_results做过一次遍历(比如打印调试、其他循环操作),导致游标提前耗尽。
解决办法
有两种常见处理方式:
- 将游标转为列表缓存:把结果一次性加载到内存中,支持多次遍历,适合数据量不大的场景:
query_results = list(mongo_collection.find(query)) emails_dict = {x.get("userId"): x.get("emailAddr") for x in query_results} send_emails_dict = {x.get("userId"): x.get("sendEmailNotification") for x in query_results}
- 单次遍历生成两个字典:避免重复遍历游标,内存占用更低,适合大数据量场景:
emails_dict = {} send_emails_dict = {} for doc in mongo_collection.find(query): user_id = doc.get("userId") emails_dict[user_id] = doc.get("emailAddr") send_emails_dict[user_id] = doc.get("sendEmailNotification")
内容的提问来源于stack exchange,提问作者Guilherme Takata
相关产品推荐
相关产品推荐

