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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 13:33:06