Atendendo às suas necessidades de:
- A) Baixo uso de RAM
- B) Atendendo às limitações de tamanho de arquivo no Mongo
- C) Uma IU responsiva
Eu consideraria algo ao longo das linhas do seguinte.
Pegue este diretório de exemplo
C:\
C:\X\
C:\X\B\
C:\X\file.txt
C:\Y\
C:\Y\file.pdf
C:\Y\R\
C:\Y\R\file.js
Em JSON, poderia ser representado como:
{
"C:": {
"X": {
"B": {},
"file.txt": "file information..."
},
"Y": {
"file.pdf": "file information...",
"R": {
"file.js": "file information..."
}
}
}
}
O último, como você apontou, não se adapta bem a grandes estruturas de diretório (posso dizer em primeira mão que os navegadores não apreciarão um blob JSON representando mesmo um diretório modesto com alguns milhares de arquivos/pastas). O primeiro, embora semelhante a alguns sistemas de arquivos reais e eficiente no contexto certo, é difícil de trabalhar com a conversão de e para JSON.
Minha proposta é dividir cada diretório em um documento JSON separado, pois isso abordará todos os três problemas, porém nada é gratuito, e isso aumentará a complexidade do código, número de solicitações por sessão etc.
A estrutura acima pode ser dividida nos seguintes documentos:
[
{
"id": "00000000-0000-0000-0000-000000000000",
"type": "d",
"name": "C:",
"children": [
"11111111-1111-1111-1111-111111111111",
"22222222-2222-2222-2222-222222222222"
]
},
{
"id": "11111111-1111-1111-1111-111111111111",
"type": "d",
"name": "X",
"children": [
"33333333-3333-3333-3333-333333333333",
"55555555-5555-5555-5555-555555555555"
]
},
{
"id": "22222222-2222-2222-2222-222222222222",
"type": "d",
"name": "Y",
"children": [
"44444444-4444-4444-4444-444444444444",
"66666666-6666-6666-6666-666666666666"
]
},
{
"id": "33333333-3333-3333-3333-333333333333",
"type": "d",
"name": "B",
"children": []
},
{
"id": "44444444-4444-4444-4444-444444444444",
"type": "d",
"name": "R",
"children": [
"77777777-7777-7777-7777-777777777777"
]
},
{
"id": "55555555-5555-5555-5555-555555555555",
"type": "f",
"name": "file.txt",
"size": "1024"
},
{
"id": "66666666-6666-6666-6666-666666666666",
"type": "f",
"name": "file.pdf",
"size": "2048"
},
{
"id": "77777777-7777-7777-7777-777777777777",
"type": "f",
"name": "file.js",
"size": "2048"
}
]
Onde cada documento representa um diretório ou arquivo e (se diretório) seus IDs filhos imediatos. Os itens filho podem ser carregados lentamente usando seus IDs e anexados ao pai na interface do usuário. O carregamento lento bem implementado pode pré-carregar nós filhos em uma profundidade desejada, criando uma interface do usuário muito responsiva. O uso de RAM é mínimo, pois seu servidor só precisa lidar com pequenas cargas úteis por solicitação. O número de solicitações aumenta consideravelmente em relação a uma abordagem de documento único, mas, novamente, alguns carregamentos lentos inteligentes podem agrupar solicitações e reduzir o número total.
ATUALIZAÇÃO 1 :de alguma forma eu esqueci seu segundo último parágrafo antes de responder, então isso é provavelmente mais ou menos o que você tinha em mente. Para resolver o problema de muitos documentos, algum nível de agrupamento de nós dentro dos documentos pode ser necessário. Eu tenho que ir agora, mas vou pensar um pouco.
ATUALIZAÇÃO 2 :criei uma essência de uma versão simplificada do conceito de clustering que mencionei. Não leva em conta arquivos, apenas pastas, e não inclui código para atualizar os documentos. Espero que lhe dê algumas ideias, continuarei a atualizá-lo para meus próprios propósitos.
Resumo:tree_docs_cluster.js