MongoDB数据更新函数触发TypeError: NoneType对象不可订阅求助
问题分析与修复方案
直接报错原因
TypeError: 'NoneType' object is not subscriptable 是因为 dvi.find_one({"user_id":user1_id}, ...) 未找到匹配user_id=95626的文档,返回了None,直接对None执行["device_id"]索引操作导致报错。
修复步骤及代码优化
1. 处理查询结果为空的边界情况
所有find_one的返回值都需要先判断是否存在,避免直接索引None:
def data_updater(user1_id, code): # 查询dvi集合,先判断是否存在对应记录 dvi_doc = dvi.find_one({"user_id": user1_id}, {"_id": 0, "user_id": 0}) if not dvi_doc: print(f"无user_id={user1_id}对应的设备数据") return device_id = dvi_doc["device_id"] # 查询update集合,同样判断记录是否存在 prv_data = update.find_one({"device_id": device_id}, {"_id": 0, "device_id": 0}) if not prv_data: print(f"无device_id={device_id}对应的更新数据") return prv_date = prv_data["date"] msg = prv_data["message"] # 确保current_date是与prv_date同类型的合法变量(如datetime对象) if prv_date < current_date and msg != code: # 修正update语句的语法错误与变量笔误 update_result = update.find_one_and_update( {"device_id": device_id}, {"$set": {"message": code, "date": current_date}}, return_document=True ) print(update_result.acknowledged if update_result else "更新操作失败")
2. 修正代码中的其他潜在问题
find_one_and_update语句存在语法错误:{"$set":message":code,...}缺少左引号,需改为{"$set": {"message": code, "date": current_date}}- 条件中的
device_id:id是笔误,应改为device_id:device_id - 确认
current_date的类型与prv_data["date"]一致(如均为datetime.datetime对象,避免字符串与日期对象的非法比较) - 若
dvi集合中user_id为字符串类型,需将传入的user1_id转为字符串:{"user_id": str(user1_id)}
调试建议
- 在MongoDB客户端手动执行查询:
db.dvi.find({"user_id": 95626}),确认是否存在该用户的记录 - 检查
dvi集合中user_id的字段类型,确保与函数传入参数的类型匹配(数字/字符串)
内容的提问来源于stack exchange,提问作者Debanjan Saha
相关产品推荐
相关产品推荐

