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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 14:01:17