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

MongoDB如何向多层嵌套数组内的文档添加新信息?

多层嵌套数组文档的更新方案(PyMongo实现)

我是MongoDB新手,目前用Python的pymongo操作数据库,遇到了多层嵌套数组的文档更新问题。

原始文档结构

{
    '_id': ObjectId('633c6ee4317752423543e8c8'),
    'ID1': -1,
    'Engagements': [
        {
            'ID2': '-2',
            'Session': [
                {'GUID': '123', 'Created_Date': '01-01-2022'},
                {'GUID': '012', 'Created_Date': '01-01-2021'}
            ]
        },
        {
            'ID2': '-3',
            'Session': [
                {'GUID': '234', 'Created_Date': '01-02-2022'},
                {'GUID': '456', 'Created_Date': '01-03-2022'}
            ]
        }
    ]
}

目标更新效果

需要找到GUID等于123的嵌套对象,添加新字段New_Info,更新后结构如下:

{
    '_id': ObjectId('633c6ee4317752423543e8c8'),
    'ID1': -1,
    'Engagements': [
        {
            'ID2': '-2',
            'Session': [
                {'GUID': '123', 'Created_Date': '01-01-2022', 'New_Info': '999'},
                {'GUID': '012', 'Created_Date': '01-01-2021'}
            ]
        },
        {
            'ID2': '-3',
            'Session': [
                {'GUID': '234', 'Created_Date': '01-02-2022'},
                {'GUID': '456', 'Created_Date': '01-03-2022'}
            ]
        }
    ]
}

PyMongo实现代码

from bson.objectid import ObjectId

collection_example.update_one(
    {"_id": ObjectId("633c6ee4317752423543e8c8")},
    {"$set": {"Engagements.$[engElem].Session.$[sessElem].New_Info": "999"}},
    array_filters=[{"engElem.ID2": "-2"}, {"sessElem.GUID": "123"}],
    upsert=False
)

代码说明

  • update_one:通过_id精准定位目标文档,仅更新匹配到的第一个文档
  • $set:指定要更新的嵌套字段路径,利用数组过滤器占位符$[engElem]和$[sessElem]定位多层数组中的目标元素
  • array_filters:定义两层过滤规则:
    1. 匹配Engagements数组中ID2为-2的元素
    2. 在上述元素的Session数组中,匹配GUID为123的对象
  • upsert=False:未找到匹配文档时,不自动插入新文档

内容的提问来源于stack exchange,提问作者AquaEthan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 08:55:17