MongoDB - pymongo.errors.DocumentTooLarge Ошибка - PullRequest
1 голос
/ 27 июня 2019

У меня есть интерфейс REST, который отправляет данные в MongoDB.Данные в основном представляют собой структуру файловой системы в виде вложенной структуры JSON, где каждый уровень в JSON имеет ключ «потомки».Этот дочерний элемент содержит подкаталоги, если это папка или файл, то он содержит содержимое файла в виде массива строк.Эти данные позже используются другим Java-приложением.Пример того, как выглядят данные JSON:

{
    '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')
}

Способ синтаксического анализа структур файловой системы:

def path_to_dict(path, child=False):
    d = {'name': os.path.basename(path)}
    if os.path.isdir(path):
        if not child:
            d['type'] = "system"
        else:
            d['type'] = "folder"
        d['path'] = os.path.relpath(path)
        d['children'] = [path_to_dict(os.path.join(path, x),
            child=True) for x in os.listdir\(path)]
    else:
        if not child:
            d['type'] = "system"
        else:
            d['type'] = "file"
        d['path'] = os.path.relpath(path)
        with open(path, 'r', encoding="utf-8", errors='ignore') as myfile:
            content = myfile.read().splitlines()
        d['children'] = content
    return d

Теперь все проанализированные файловые системы работают успешноза исключением одной системы, которая выдавала ошибку: pymongo.errors.DocumentTooLarge: BSON document too large (74101706 bytes) - the connected server supports BSON document sizes up to 16793598 bytes.

Я понимаю, что существует ограничение в 16 МБ для размера документа, и многие предложили использовать GridFS для разбиения файла.Моя проблема в том, что нет одного файла, который обеспечивает такой большой размер документа, а несколько небольших документов.

Конечная точка POST моего сервера выглядит следующим образом:

def post(self, collection_name):
        user = mongo.db[collection_name]  
        client_request = request.get_json(force=True)
        user.insert(client_request)  

Каким может быть решение этой проблемы?Является ли GridFS полезной в подобном сценарии?

РЕДАКТИРОВАТЬ: Структура файловой системы, которая дает сбой, имеет несколько подпапок, содержащих файлы C, содержимое которых обрабатывается как строки и хранится как массив строк во вложенном файле.JSON.

...