Запросите вложенный документ JSON в коллекции MongoDB с помощью Python - PullRequest
0 голосов
/ 30 июня 2019

У меня есть коллекция 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']
 }

EDIT: До сих пор я придумал вот что. Конечная точка моей колбы:

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 голосов
/ 30 июня 2019

Я не думаю, что mongodb поддерживает рекурсивные или глубокие запросы в документе (ни рекурсивные $unwind).Однако он предоставляет рекурсивные запросы к документам, ссылающимся на другой, то есть агрегирует элементы из графика ($graphLookup).

Этот ответ довольно хорошо объясняет,что вам нужно сделать, чтобы запросить дерево.

Хотя это не решает вашу проблему напрямую, вы можете пересмотреть структуру данных.Это, конечно, интуитивно понятно, но обновления могут быть болезненными - как и запросы для вложенных элементов, как вы только что заметили.

Поскольку $graphLookup позволяет создавать представление, равное вашему текущему документу, я не могу думатьИз всех преимуществ явно вложенная структура имеет более одного документа на путь.Будет небольшая потеря производительности при чтении и записи всего дерева, но при правильной индексации все должно быть в порядке.

...