如何对比程序输入数据与MongoDB存储数据实现登录校验
MongoDB登录信息比对实现方案
核心思路:不需要遍历全表所有用户逐一比对,直接通过MongoDB的查询条件精准匹配输入的用户名和密码即可,性能更高逻辑也更简洁。
代码优化点
- 注册逻辑中,旧版
insert()方法已被pymongo弃用,推荐替换为insert_one()避免版本兼容问题,同时可增加用户名重复校验,避免同用户名多次注册引发数据冲突 - 登录逻辑不要用
find()返回全量用户数据遍历,直接用find_one()传入查询条件,数据库层面直接过滤匹配结果,查询效率远高于本地遍历
完整修改后代码
import pymongo from getpass import getpass baglanti = pymongo.MongoClient("mongodb+srv://user:secure@denemeler.s4ufh.mongodb.net/Bankamatik?authSource=admin&w=majority&readPreference=primary&appname=MongoDB%20Compass&retryWrites=true&ssl=true") bankamatik = baglanti["Bankamatik"] hesap = bankamatik["BankaHesapBilgileri"] def kayitOl(): kullaniciadi = input("Kayıt bölümüne hoş geldiniz. \nKullanıcı adı: ") sifre = getpass("Şifre(gizli): ") # 可选项:校验用户名是否已存在 exist_user = hesap.find_one({"kullaniciadi": kullaniciadi}) if exist_user: print("该用户名已被注册,请更换后重试") return # 替换insert为insert_one hesap.insert_one({"kullaniciadi": kullaniciadi, "sifre": sifre, "bakiye": 1000}) print("Kayıt başarıyla oluşturulmuştur.") print("Hoş geldiniz.") girismenu = int(input("Hoş geldiniz. Giriş yapmak isterseniz 1, hesabınız yok ve kayıt olmak isterseniz 2 yazınız.")) if girismenu == 2: kayitOl() if girismenu == 1: print("Giriş yapma kısmındasınız. Lütfen bilgilerinizi girin.") kullaniciadi = input("Kullanıcı adı: ") sifre = getpass("Şifre(gizli): ") # 如果你的密码存储为数字类型,解开下面一行注释做类型转换 # sifre = int(sifre) # 核心查询逻辑:直接匹配用户名和密码 matched_user = hesap.find_one({"kullaniciadi": kullaniciadi, "sifre": sifre}) if matched_user: print("登录成功") # 后续可扩展登录后的业务逻辑,比如余额查询、转账等 else: print("用户名或密码错误,请重试")
注意:
getpass()返回的结果默认是字符串类型,如果你数据库中存储的密码是数字类型(比如示例中的33),需要在查询前将输入的密码转为对应数字类型,否则会因为类型不匹配导致匹配失败。
内容的提问来源于stack exchange,提问作者Emir
相关产品推荐
相关产品推荐

