La domanda su quale schema si adatta meglio al tipo di modello di accesso a cui descrivi una risposta in alcuni esempi parla di come rappresentare una gerarchia in MongoDB/database di documenti.
Una risposta comune che funziona per molte query diverse è dove memorizzi in ogni file il nome, la dimensione, il genitore diretto e l'array di tutti i suoi antenati.
Ciò renderebbe i tuoi dati di esempio:
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 })
Ora, se vuoi eseguire query per cose come "File in questa directory" o "tutti i file in questa directory (incluso in modo ricorsivo)", esegui una query:
db.files.find( { parent: "root" } ) // all files in /src directory
db.files.find( {ancestors: "root"} ) // all files under /root directory tree
Poiché è necessario utilizzare il framework di aggregazione per ottenere cose come sum, la query per la dimensione della cartella sarebbe:
db.files.aggregate([
{$match:{ancestors:"src"}},
{$group:{
_id: "src",
total_size: {$sum:"$size"}
}
}
]);
Per vedere la dimensione di tutte le cartelle che si trovano nella cartella principale sarebbe:
db.files.aggregate([
{$match:{ancestors:"root"}},
{$group:{
_id: "root",
total_size: {$sum:"$size"}
}
}
]);