MongoDB查询返回None引发TypeError:'NoneType'对象不可下标访问
问题分析与解决
错误根源
触发TypeError: 'NoneType' object is not subscriptable的核心原因是:test.find_one({"_id": 1})没有找到匹配的文档,返回了None,而你直接对None执行['models']索引操作,自然会报错。
可能的具体场景:
- 数据库中不存在
_id为1的文档,导致查询结果为空。 - 如果你的
_id是MongoDB默认生成的ObjectId类型,用整数1查询是匹配不到的,必须用对应的ObjectId字符串转换后再查询。
修复方案
1. 先判断查询结果是否存在,再访问字段
永远不要假设find_one一定能返回文档,必须先做非空判断:
# ROW 4 start_date = DateEntry(start_frame, selectmode='day', year=2020, month=11, day=22) start_date.grid(row=4, column=0, sticky=W, padx=10, pady=10) end_date = DateEntry(start_frame, selectmode='day', year=2020, month=11, day=22) end_date.grid(row=4, column=1, sticky=W, padx=10, pady=10) # 先获取查询结果并做非空判断 doc = test.find_one({"_id": 1}) if doc is not None: res = doc['models'] clicked.set(res[0]) drop = OptionMenu(start_frame, clicked, *res) drop.grid(row=4, column=2, sticky=W, padx=10, pady=10) else: # 处理未找到文档的情况,比如提示或设置默认值 print("未找到_id为1的文档")
2. 确认_id类型是否匹配
如果你的_id是MongoDB自动生成的ObjectId,需要先导入bson.objectid.ObjectId并转换查询条件:
from bson.objectid import ObjectId # 替换为你实际的ObjectId字符串 doc = test.find_one({"_id": ObjectId("60d21b4667d0d8992e610c85")})
额外建议
可以给models字段设置默认值,避免后续res[0]或*res出现索引越界错误:
res = doc.get('models', []) if res: clicked.set(res[0]) drop = OptionMenu(start_frame, clicked, *res) drop.grid(row=4, column=2, sticky=W, padx=10, pady=10) else: print("文档中models字段为空或不存在")
内容的提问来源于stack exchange,提问作者siddxx18
相关产品推荐
相关产品推荐

