Otázka o tom, jaké schéma by nejlépe odpovídalo typu vzoru přístupu, který popisujete, a zodpovězena v některém příkladu hovoří o tom, jak reprezentovat hierarchii v MongoDB/databázi dokumentů.
Běžná odpověď, která funguje pro mnoho různých dotazů, je, kde do každého souboru uložíte jeho název, velikost, přímého rodiče a pole všech jeho předků.
To by vaše ukázková data:
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 })
Nyní, pokud se chcete dotazovat na věci jako "Soubory v tomto adresáři" nebo "všechny soubory v tomto adresáři (včetně rekurzivně)", dotazujte se:
db.files.find( { parent: "root" } ) // all files in /src directory
db.files.find( {ancestors: "root"} ) // all files under /root directory tree
Protože k získání věcí, jako je součet, potřebujete použít agregační rámec, dotaz na velikost složky by byl:
db.files.aggregate([
{$match:{ancestors:"src"}},
{$group:{
_id: "src",
total_size: {$sum:"$size"}
}
}
]);
Chcete-li zobrazit velikost všech složek, které jsou v kořenové složce, bylo by to:
db.files.aggregate([
{$match:{ancestors:"root"}},
{$group:{
_id: "root",
total_size: {$sum:"$size"}
}
}
]);