У меня есть интерфейс 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.