Python使用pymongo读取MongoDB仅首个pin校验生效是什么问题
代码问题分析
- 核心逻辑缺陷:for循环只要匹配到第一条不相符的pin,就会直接执行
sys.exit(0)终止程序,完全不会遍历后续存储的第二条数据。输入2222时,第一次循环会先匹配到第一条存储的1111,匹配失败后程序直接退出,因此永远不会判断到第二条的2222记录。 - 冗余无效代码:else分支中的
login_data != item['pin']是无意义的比较表达式,既没有赋值操作也没有逻辑判断作用,属于冗余代码。
修复方案
有两种优化方式,第一种是修正原有遍历逻辑,第二种是直接利用MongoDB查询能力提升效率:
方式1:修正遍历逻辑
import pymongo import sys cluster = pymongo.MongoClient("mongodb://localhost:27017/") db = cluster['test'] collection = db['test'] login_data = int(input("Enter the pin:")) result = collection.find({}) login_success = False for item in result: if login_data == item['pin']: print("Login successfully") login_success = True break # 遍历完全部数据后再判断是否匹配失败 if not login_success: print("Invalid pin") sys.exit(0)
方式2:直接查询匹配记录(更高效)
不需要全表遍历所有数据,直接向MongoDB查询是否存在对应pin的记录即可,性能更优:
import pymongo import sys cluster = pymongo.MongoClient("mongodb://localhost:27017/") db = cluster['test'] collection = db['test'] login_data = int(input("Enter the pin:")) # 直接查询是否存在对应pin的记录 match_item = collection.find_one({"pin": login_data}) if match_item: print("Login successfully") else: print("Invalid pin") sys.exit(0)
内容的提问来源于stack exchange,提问作者Joy Chakraborty
相关产品推荐
相关产品推荐

