如何使用 pymongo 更新 MongoDB 中嵌套文档的一项

时间:2021-01-09 23:16:08

标签: python-3.x mongodb pymongo

Python 3.7 版 MongoDB 4.2 版

我有一个 mongoDB 集合,其中单个文档看起来像这样:

    {'_id':'1234',
    'name':'foo'
    'sub_doc_1':[{'a_id':'a1234',
                'a_date':'1/1/2020',
                'sub_doc_2':[{'x_id':'b1234',
                              'a_score:50},
                             {'x_id':'b2345',
                              'a_score:75}]},
                             {'a_id:'a789',
                              'a_date':'1/2/2020',
                 'sub_doc_2':[{'x_id':'b3456',
                             'a_score:25}]
                 }]}
     

我正在尝试使用 update_one 更新给定 a_score 的值,但我在访问嵌套文档 sub_doc_2 时遇到了真正的问题。按照文档 here 更新文档的“a_date”是相对直接的,该文档的“a_date”仅基于知道其 ObjectId 嵌套一次(或者在我的情况下,我已将自己的“_id”分配为“_id”

result = db.collection.update_one(
    {
        '_id':'1234'
    },
    {
        '$set':
        {
            'sub_doc_1.$[elem].a_date':'4/5/3120'
        }
    },
    
    upsert=False,
    array_filters=[{'elem.a_id':'a1234'}]
)

这有效并成功更新了正确嵌入文档中的相应字段:

    {'_id':'1234',
    'name':'foo'
    'sub_doc_1':[{'a_id':'a1234',
                'a_date':'4/5/3120',
                'sub_doc_2':[{'x_id':'b1234',
                              'a_score:50},
                             {'x_id':'b2345',
                              'a_score:75}]},
                             {'a_id:'a789',
                              'a_date':'1/2/2020',
                'sub_doc_2':[{'x_id':'b3456',
                             'a_score:25}]
                }]}

我遇到的问题是,当我尝试使用文档中的这些相同的方向和原则时,我无法让它对第二次嵌套的文档起作用:

result = db.collection.update_one(
    {
        '_id':'1234'
    },
    {
        '$set':
        {
            'sub_doc_1.sub_doc_2.$[elem].a_score':9999
        }
    },
    
    upsert=False,
    array_filters=[{'elem.x_id':'b3456'}]
)

我期待的输出是

    {'_id':'1234',
    'name':'foo'
    'sub_doc_1':[{'a_id':'a1234',
                'a_date':'1/1/2020',
                'sub_doc_2':[{'x_id':'b1234',
                              'a_score:50},
                             {'x_id':'b2345',
                              'a_score:75}]},
                             {'a_id:'a789',
                              'a_date':'1/2/2020',
                 'sub_doc_2':[{'x_id':'b3456',
                             'a_score:9999}]
                 }]}

但是我遇到了这个写入错误:

<块引用>

WriteError: 路径 'sub_doc_1.sub_doc_2' 必须存在于文档中 为了应用数组更新。,完整错误:{'index':0,'code':2, 'errmsg': "路径 'sub_doc_1.sub_doc_2' 必须存在于文档中 以便应用数组更新。"}

我尝试过使用 array_filters 参数,但无法让它工作!任何帮助将不胜感激

更新

惊人的睡眠可以做什么!从那以后,我发现 this post 可以回答我的问题。

对我来说更重要的一点是我应该考虑我的文档结构是否需要像现在这样嵌套(尽管在我的项目中这不是我现在可以改变的 - 你生活和学习!)。 这是有效的代码:

result = db.collection.update_one(
    {
        '_id':'1234',
        'sub_doc_1':
         {
             '$elemMatch':
              {
                  'a_id':'a1234',
                  'sub_doc_2.x_id':'b3456'
              }
          }
    },
    {
        '$set':
        {
            'sub_doc_1.$[outer].sub_doc_2.$[inner].a_score':9999
        }
    },

    upsert=False,
    array_filters=[{'outer.a_id':'a1234'}, {'inner.x_id':'b3456'}]
)

0 个答案:

没有答案
相关问题