You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对比程序输入数据与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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 22:42:02