我有一个包含多个文档的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')
}
还有其他包含类似结构的文档。如何查询此集合以在path
与sys/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
来提取文档的特定部分。
答案 0 :(得分:0)
我不认为mongodb支持文档中的递归查询或深度查询(都不是递归$unwind
)。但是,它提供的是跨文档的递归查询,该文档引用了另一个文档,即从图形($graphLookup
)聚合元素。
This answer很好地解释了查询树所需要做的事情。
尽管它不能直接解决您的问题,但您可能需要重新评估数据结构。它当然很直观,但是更新可能会很痛苦-正如您刚刚注意到的那样,以及对嵌套元素的查询。
由于$graphLookup
允许您创建一个与当前文档相等的视图,因此我无法想到显式嵌套结构相对于每个路径具有一个文档所没有的优势。读取和写入整个树会略有性能损失,但是通过正确的索引应该可以。