【问题标题】:Query nested JSON document in MongoDB collection using Python使用 Python 查询 MongoDB 集合中的嵌套 JSON 文档
【发布时间】:2019-11-11 11:52:32
【问题描述】:

我有一个包含多个文档的 MongoDB 集合。文档如下所示:

{
    'name': 'sys',
    'type': 'system',
    'path': 'sys',
    'children': [{
        'name': 'folder1',
        'type': 'folder',
        'path': 'sys/folder1',
        'children': [{
            'name': 'folder2',
            'type': 'folder',
            'path': 'sys/folder1/folder2',
            'children': [{
                'name': 'textf1.txt',
                'type': 'file',
                'path': 'sys/folder1/folder2/textf1.txt',
                'children': ['abc', 'def']
            }, {
                'name': 'textf2.txt',
                'type': 'file',
                'path': 'sys/folder1/folder2/textf2.txt',
                'children': ['a', 'b', 'c']
            }]
        }, {
            'name': 'text1.txt',
            'type': 'file',
            'path': 'sys/folder1/text1.txt',
            'children': ['aaa', 'bbb', 'ccc']
        }]
    }],
    '_id': ObjectId('5d1211ead866fc19ccdf0c77')
}

还有其他包含类似结构的文档。如何查询此集合以在pathsys/folder1/text1.txt 匹配的多个文档中查找一个文档的一部分?

我想要的输出是:

{
   'name': 'text1.txt',
   'type': 'file',
   'path': 'sys/folder1/text1.txt',
   'children': ['aaa', 'bbb', 'ccc']
 }

编辑: 到目前为止,我想出的是这个。我的 Flask 端点:

class ExecuteQuery(Resource):
    def get(self, collection_name):
        result_list = []  # List to store query results
        query_list = []  # List to store the incoming queries
        for k, v in request.json.items():
            query_list.append({k: v})  # Store query items in list
        cursor = mongo.db[collection_name].find(*query_list)  # Execute query
        for document in cursor:
            encoded_data = JSONEncoder().encode(document)  # Encode the query results to String
            result_list.append(json.loads(encoded_data))  # Update dict by iterating over Documents
        return result_list  # Return query result to client

我的客户端:

request = {"name": "sys"}
response = requests.get(url, json=request, headers=headers) 
print(response.text)

这给了我整个文档,但我无法通过匹配 path 来提取文档的特定部分。

【问题讨论】:

  • 不同的事情:你应该清理用户输入

标签: python mongodb flask pymongo


【解决方案1】:

我认为 mongodb 不支持文档中的递归或深度查询(递归 $unwind 也不支持)。然而,它提供的是跨文档的递归查询引用另一个文档,即从图中聚合元素 ($graphLookup)。

This answer 很好地解释了查询树需要做什么。

虽然它不能直接解决您的问题,但您可能需要重新评估您的数据结构。这当然很直观,但更新可能很痛苦——正如您刚刚注意到的,对嵌套元素的查询也是如此。

由于$graphLookup 允许您创建与当前文档相同的视图,我想不出显式嵌套结构比每个路径一个文档有什么优势。读取和写入整棵树会有轻微的性能损失,但通过适当的索引应该没问题。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2018-03-09
  • 2021-02-25
  • 2016-08-16
  • 2015-02-10
  • 2012-10-17
  • 2016-05-07
  • 2023-03-08
相关资源
最近更新 更多