De vraag over welk schema het beste past bij het type toegangspatroon dat u beschrijft en beantwoordt in een aantal voorbeelden, gaat over hoe een hiërarchie in MongoDB/documentdatabase kan worden weergegeven.
Een veelgebruikt antwoord dat voor veel verschillende zoekopdrachten werkt, is dat u in elk bestand de naam, grootte, directe ouder en array van al zijn voorouders opslaat.
Dat zou uw voorbeeldgegevens maken:
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 })
Als u nu zaken als "Bestanden in deze map" of "alle bestanden onder deze map (inclusief recursief)" wilt opvragen, vraagt u:
db.files.find( { parent: "root" } ) // all files in /src directory
db.files.find( {ancestors: "root"} ) // all files under /root directory tree
Omdat je een aggregatieraamwerk moet gebruiken om dingen als som te krijgen, zou de vraag naar de grootte van de map zijn:
db.files.aggregate([
{$match:{ancestors:"src"}},
{$group:{
_id: "src",
total_size: {$sum:"$size"}
}
}
]);
Om de grootte van alle mappen in de hoofdmap te zien, zou het zijn:
db.files.aggregate([
{$match:{ancestors:"root"}},
{$group:{
_id: "root",
total_size: {$sum:"$size"}
}
}
]);