【问题标题】:Update fields in mongoDb document hierarchy dynamically动态更新 mongoDb 文档层次结构中的字段
【发布时间】:2021-05-25 17:45:31
【问题描述】:

我正在更新一个具有以下文档结构的集合(此处提到的 2 个示例):

{
    "_id": 1,
    "page_id": 1,
    "sec_fields": [
        "title",
        "list"
    ],
    "settings": {
        "title": {
            "content": "How It Works?"
        },
        "list": {
            "items": [
                {
                    "media": {
                        "type": "image",
                        "urls": [
                            "assets/images/book-appointment.jpg"
                        ]
                    }
                },
                {
                    "media": {
                        "type": "image",
                        "urls": [
                            "assets/images/get-confirmation.jpg"
                        ]
                    }
                },
                {
                    "media": {
                        "type": "image",
                        "urls": [
                            "assets/images/relax-its-done.jpg"
                        ]
                    }
                }
            ]
        }
    }
}
-----------------------------------------------------------------------------------
{
    "_id": 2,
    "page_id": 2,
    "sec_fields": [
        "social_links"
    ],
    "settings": {
        "social_links": {
            "items": [
                {
                    "media": {
                        "urls": [
                            "assets/images/fb-light-rounded.png"
                        ]
                    },
                    "title": "fb"
                },
                {
                    "media": {
                        "urls": [
                            "assets/images/insta-light-rounded.png"
                        ]
                    },
                    "title": "instagram"
                },
                {
                    "media": {
                        "urls": [
                            "assets/images/yelp-light-rounded.png"
                        ]
                    },
                    "title": "yelp"
                }
            ]
        }
    }
}

像上面提到的两个一样,大约有 50 种不同的文档结构。我需要使用 mongodb 查询更新 urls 字段值。我在 mongodb 文档中找不到任何内容。有没有办法从多个文档结构中更新单个字段?

我们将不胜感激。

谢谢!

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    好的,所以我的尝试绝对是疯狂的,我不会推荐它,但无论如何它可能对你有帮助 - 我尝试通过经典查询 -> 获取数据 -> 修改文档 -> 更新文档:

    for key, val in document.items():
        if key == "url":
            print("Do stuff if you want, you can do this on every level")
    
        if isinstance(val, dict):
            for sub_key, sub_val in document[key].items():
                if sub_key == "url":
                    print("Do stuff again")
    
                if isinstance(sub_val, dict):
                    for sub_sub_key, sub_sub_val in document[key][sub_key].items():
    
                        # so now we have lists.. this only works if the structure is always like this
                        for idx, list_entry in enumerate(sub_sub_val):
    
                            # check for nested dictionaries again
                            if isinstance(list_entry, dict):
    
                                for sub_sub_sub_key, sub_sub_sub_val in list_entry.items():
    
                                    # and again
                                    if isinstance(sub_sub_sub_val, dict):
                                        
                                        for sub_sub_sub_sub_key, sub_sub_sub_sub_val in list_entry[sub_sub_sub_key].items():
                                            
                                            # now were at the level we want to be at
                                            if sub_sub_sub_sub_key == "urls":
    
                                                # url paths are again stored in a list, ill just access first index
                                                this_val = document[key][sub_key][sub_sub_key][idx][sub_sub_sub_key][sub_sub_sub_sub_key][0]
    
                                                print(f"Changing extension from from {this_val} to 'something'")
                                                
                                                # overwrite value
                                                document[key][sub_key][sub_sub_key][idx][sub_sub_sub_key][sub_sub_sub_sub_key][0] = 'something'
                                                
    
    

    如您所见,我进入 11 个缩进级别只是为了查看 4 次嵌套字典。没有找到任何其他选项来搜索具有混合列表的嵌套字典内的键。祝你好运,期待一个正确的答案:)

    【讨论】:

      猜你喜欢
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-28
      • 1970-01-01
      相关资源
      最近更新 更多