Frågan om vilket schema som bäst skulle passa den typ av åtkomstmönster du beskriver och besvaras i några exempel talar om hur man representerar en hierarki i MongoDB/dokumentdatabas.
Ett vanligt svar som fungerar för många olika frågor är var du lagrar i varje fil dess namn, storlek, direkta överordnade och array av alla dess förfäder.
Det skulle göra dina exempeldata:
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 })
Om du nu vill fråga efter saker som "Filer i den här katalogen" eller "alla filer i den här katalogen (inklusive rekursivt)" frågar du:
db.files.find( { parent: "root" } ) // all files in /src directory
db.files.find( {ancestors: "root"} ) // all files under /root directory tree
Eftersom du behöver använda aggregeringsramverk för att få saker som summa, skulle frågan om storleken på mappen vara:
db.files.aggregate([
{$match:{ancestors:"src"}},
{$group:{
_id: "src",
total_size: {$sum:"$size"}
}
}
]);
För att se storleken på alla mappar som finns i rotmappen skulle det vara:
db.files.aggregate([
{$match:{ancestors:"root"}},
{$group:{
_id: "root",
total_size: {$sum:"$size"}
}
}
]);