使用Flask+PyMongo保存嵌套数组对象至MongoDB时的异常问题
Flask+PyMongo嵌套数组保存异常修复方案
问题现象
尝试通过Flask结合PyMongo将包含嵌套数组(数组的数组)的文档保存至MongoDB时,仅sessions字段结构异常:原本的二维数组被错误存储为不完整的单层数组,其他字段更新正常。
预期文档结构
{ "_id": ObjectId("62e365c6f1cb5816b7a152f8"), "_class": "org.data.model", "topic": "Demo", "extra": { "type": "periodic", "sessions": [ [{"morning": "8:00"}, {"noon": "1:00"}, {"evening": "5:00"}], [{"morning": "10:00"}, {"noon": "3:00"}, {"evening": "7:00"}], [{"morning": "9:00"}, {"noon": "2:00"}, {"evening": "6:00"}] ], "mentor": "Dr Vishual Raj" } }
实际错误结构
{ "_id": ObjectId("62e365c6f1cb5816b7a152f8"), "_class": "org.data.model", "topic": "Demo", "extra": { "type": "periodic", "sessions": [{"morning": "9:00"}], {"noon": "2:00"}, {"evening": "6:00"}], "mentor": "Dr Vishual Raj" } }
修复方案
方案1:替换整个文档(推荐)
如果需要完整覆盖目标文档,使用replace_one而非update_one,确保文档结构完全符合预期:
from bson.objectid import ObjectId document = { "_id": ObjectId("62e365c6f1cb5816b7a152f8"), "_class": "org.data.model", "topic": "Demo", "extra": { "type": "periodic", "sessions": [ [{"morning": "8:00"}, {"noon": "1:00"}, {"evening": "5:00"}], [{"morning": "10:00"}, {"noon": "3:00"}, {"evening": "7:00"}], [{"morning": "9:00"}, {"noon": "2:00"}, {"evening": "6:00"}] ], "mentor": "Dr Vishual Raj" } } myclient = pymongo.MongoClient(getConfig('MONGO')['MONGO_CONN_STRING']) mydb = myclient[getConfig('MONGO')['MONGO_DB']] my_collection = mydb["collection_data"] # 替换匹配到的文档,可选upsert=True实现不存在则插入 x = my_collection.replace_one({"_id": ObjectId("62e365c6f1cb5816b7a152f8")}, document)
方案2:精准更新指定字段
如果只需更新sessions字段,无需修改其他内容,直接指定$set的嵌套路径,避免全量更新的潜在问题:
from bson.objectid import ObjectId update_data = { "$set": { "extra.sessions": [ [{"morning": "8:00"}, {"noon": "1:00"}, {"evening": "5:00"}], [{"morning": "10:00"}, {"noon": "3:00"}, {"evening": "7:00"}], [{"morning": "9:00"}, {"noon": "2:00"}, {"evening": "6:00"}] ] } } myclient = pymongo.MongoClient(getConfig('MONGO')['MONGO_CONN_STRING']) mydb = myclient[getConfig('MONGO')['MONGO_DB']] my_collection = mydb["collection_data"] x = my_collection.update_one({"_id": ObjectId("62e365c6f1cb5816b7a152f8")}, update_data)
说明
- 使用
replace_one会完全替换匹配到的文档,原文档的额外字段会被删除;若需保留原文档其他字段,优先选择方案2。 - 确保代码中导入
ObjectId(from bson.objectid import ObjectId),避免类型匹配错误。
内容的提问来源于stack exchange,提问作者Vishwas
相关产品推荐
相关产品推荐

