使用Python查询MongoDB集合中的嵌套JSON文档

时间:2019-06-30 13:34:02

标签: python mongodb flask pymongo

我有一个包含多个文档的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来提取文档的特定部分。

1 个答案:

答案 0 :(得分:0)

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

This answer很好地解释了查询树所需要做的事情。

尽管它不能直接解决您的问题,但您可能需要重新评估数据结构。它当然很直观,但是更新可能会很痛苦-正如您刚刚注意到的那样,以及对嵌套元素的查询。

由于$graphLookup允许您创建一个与当前文档相等的视图,因此我无法想到显式嵌套结构相对于每个路径具有一个文档所没有的优势。读取和写入整个树会略有性能损失,但是通过正确的索引应该可以。