Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
动态更新mongoDb文档层次结构中的字段_Mongodb - Fatal编程技术网

动态更新mongoDb文档层次结构中的字段

动态更新mongoDb文档层次结构中的字段,mongodb,Mongodb,我正在更新一个集合,该集合具有以下文档结构(此处以2为例): 与上面提到的两个类似,大约有50种不同的文档结构。我需要使用mongodb查询更新URL字段值。我在mongodb文档中找不到任何内容。有没有办法从多个文档结构中更新单个字段 任何帮助都将不胜感激 谢谢 好吧,我的尝试绝对疯狂,我不会推荐它,但也许它对你有帮助-我尝试了经典的查询->获取数据->修改文档->更新文档: for key, val in document.items(): if key == "url&q

我正在更新一个集合,该集合具有以下文档结构(此处以2为例):

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

任何帮助都将不胜感激


谢谢

好吧,我的尝试绝对疯狂,我不会推荐它,但也许它对你有帮助-我尝试了经典的查询->获取数据->修改文档->更新文档:

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次嵌套字典。未找到任何其他选项来搜索混合列表嵌套字典中的键。祝你好运,期待着一个合适的答案:)

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'