A pergunta sobre qual esquema se encaixaria melhor no tipo de padrão de acesso que você descreve e respondida em algum exemplo fala sobre como representar uma hierarquia no banco de dados MongoDB/documento.
Uma resposta comum que funciona para muitas consultas diferentes é onde você armazena em cada arquivo seu nome, tamanho, pai direto e matriz de todos os seus ancestrais.
Isso tornaria seus dados de amostra:
db.files.save({ _id: "root"})
db.files.save({ _id: "src", parent: "root", ancestors: ["root"] } )
db.files.save({ _id: "lib", parent: "root", ancestors: ["root"]} )
db.files.save({ _id: "config.cfg", parent: "root", ancestors: ["root"], size: 2310 })
db.files.save({ _id: "file1.js", parent: "src", ancestors: ["root","src"], size: 5039 })
db.files.save({ _id: "file2.js", parent: "src", ancestors: ["root","src"], size: 1299 })
Agora, se você quiser consultar coisas como "Arquivos neste diretório" ou "todos os arquivos neste diretório (incluindo recursivamente)", você consulta:
db.files.find( { parent: "root" } ) // all files in /src directory
db.files.find( {ancestors: "root"} ) // all files under /root directory tree
Como você precisa usar a estrutura de agregação para obter coisas como soma, a consulta para o tamanho da pasta seria:
db.files.aggregate([
{$match:{ancestors:"src"}},
{$group:{
_id: "src",
total_size: {$sum:"$size"}
}
}
]);
Para ver o tamanho de todas as pastas que estão na pasta raiz, seria:
db.files.aggregate([
{$match:{ancestors:"root"}},
{$group:{
_id: "root",
total_size: {$sum:"$size"}
}
}
]);