Pytanie o to, jaki schemat najlepiej pasuje do typu wzorca dostępu, który opisujesz, a odpowiedź w pewnym przykładzie mówi o tym, jak reprezentować hierarchię w bazie danych MongoDB/dokumentów.
Powszechną odpowiedzią, która działa dla wielu różnych zapytań, jest przechowywanie w każdym pliku jego nazwy, rozmiaru, bezpośredniego rodzica i tablicy wszystkich jego przodków.
To sprawiłoby, że twoje przykładowe dane:
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 })
Teraz, jeśli chcesz zapytać o rzeczy takie jak „Pliki w tym katalogu” lub „wszystkie pliki w tym katalogu (w tym rekursywnie)”, zapytaj:
db.files.find( { parent: "root" } ) // all files in /src directory
db.files.find( {ancestors: "root"} ) // all files under /root directory tree
Ponieważ musisz użyć struktury agregacji, aby uzyskać takie rzeczy jak suma, zapytanie o rozmiar folderu będzie wyglądało następująco:
db.files.aggregate([
{$match:{ancestors:"src"}},
{$group:{
_id: "src",
total_size: {$sum:"$size"}
}
}
]);
Aby zobaczyć rozmiar wszystkich folderów znajdujących się w folderze głównym:
db.files.aggregate([
{$match:{ancestors:"root"}},
{$group:{
_id: "root",
total_size: {$sum:"$size"}
}
}
]);