Pymongo嵌套遍历两个cursor对象时内层循环仅执行一次问题
问题根因
- Pymongo查询返回的
Cursor是单次遍历迭代器,首次遍历完成后游标指针会停在数据集末尾,后续再次遍历该游标不会返回任何数据。你的代码在第一次外层循环处理第一个user时,已经完整遍历了locations游标,剩下的外层循环再执行内层遍历时,locations游标已经处于耗尽状态,自然没有输出。
修复方案
方案1:预加载locations到内存(适用于locations数据量较小的场景)
将locations游标一次性转为列表存储到内存,后续每次遍历都使用该列表,仅需一次数据库查询:
user_count = 0 location_count = 0 # 提前将locations游标转为列表 locations = list(locations) for user in users: print(user) user_count += 1 for location in locations: print(location) location_count += 1 print(user_count, location_count)
如果locations数据集过大,全量加载可能导致内存溢出,可选择方案2。
方案2:每次内层循环重新查询locations(适用于locations数据量较大的场景)
每次需要遍历locations时都重新发起查询获取新的游标,避免一次性加载全量数据:
user_count = 0 location_count = 0 for user in users: print(user) user_count += 1 # 每次执行内层循环前重新查询获取新的locations游标,需替换为你实际的查询条件 locations = db.your_location_collection.find(你的查询条件) for location in locations: print(location) location_count += 1 print(user_count, location_count)
该方案的缺点是会发起多次数据库查询,数据库压力高于方案1,请根据实际业务场景选择。
内容的提问来源于stack exchange,提问作者eggsloveoats
相关产品推荐
相关产品推荐

