MongoDB Atlas连接异常:读取文档字段时自动转向本地数据库而非Atlas
MongoDB Atlas连接异常:读取文档字段时自动转向本地数据库而非Atlas
看起来你遇到的问题根源其实是变量名误用加上PyMongo游标的惰性求值特性导致的,咱们一步步拆解解决:
第一个核心问题:函数参数不匹配
你的函数定义是def authorize_token(database, token):,但函数内部却用了db["tokens"]来访问集合——这里的db根本不是你传入的Atlas连接实例!如果你的代码里全局有一个默认指向本地MongoDB的db变量,那游标在实际执行查询(访问[0]的时候)就会用这个本地连接,而不是你传入的Atlas连接。第二个问题:游标使用不当
PyMongo的find()返回的是一个惰性求值的游标,不是直接的查询结果。你用[0]去取第一个文档的写法不仅不安全(没有匹配文档时会抛出索引错误),而且会延迟查询执行时机,这就放大了第一个变量名错误的影响——直到你访问游标元素时,才会用错误的db去发起查询。
修正后的代码
import time from pymongo import MongoClient from os import getenv def authorize_token(database, token): # 用find_one直接获取匹配的单个文档,避免游标延迟执行的问题 token_document = database["tokens"].find_one({"token": token}) if token_document: if token_document["expiry"] <= time.time(): print("expired") return 410, "Expired Token" print("past expiry") return 200, token_document["id"] else: return 400, "No Token" if __name__ == "__main__": # 确保连接到Atlas db = MongoClient(getenv("MONGO_DB_URI"))["BetterMUN"] # 修正测试逻辑:find()返回游标永远为真,改用find_one()判断是否存在文档 if db["users"].find_one({"username": "oliver"}): print("proof working") authorize_token(db, "5a4303cd-fe36-40f1-be34-6dc843dbd99b")
关键修正点说明
- 把函数内部的
db改成参数database,确保全程使用传入的Atlas连接实例; - 用
find_one()替代find()[0],直接获取单个匹配文档,既避免了索引错误,也消除了游标延迟执行的隐患; - 修正了主函数里的测试逻辑:原来的
find()返回游标对象,哪怕没有匹配文档也会被判定为True,改用find_one()才能正确判断目标文档是否存在。
另外,建议你检查代码里是否有全局的db变量指向本地MongoDB(比如db = MongoClient()这种默认连接),这会导致意外的连接切换。
备注:内容来源于stack exchange,提问作者anoliver
相关产品推荐
相关产品推荐

