La question de savoir quel schéma correspondrait le mieux au type de modèle d'accès que vous décrivez et dont la réponse dans certains exemples explique comment représenter une hiérarchie dans la base de données MongoDB/document.
Une réponse courante qui fonctionne pour de nombreuses requêtes différentes consiste à stocker dans chaque fichier son nom, sa taille, son parent direct et le tableau de tous ses ancêtres.
Cela donnerait à vos exemples de données :
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 })
Maintenant, si vous souhaitez interroger des éléments tels que "Fichiers de ce répertoire" ou "Tous les fichiers de ce répertoire (y compris de manière récursive)", vous interrogez :
db.files.find( { parent: "root" } ) // all files in /src directory
db.files.find( {ancestors: "root"} ) // all files under /root directory tree
Étant donné que vous devez utiliser le cadre d'agrégation pour obtenir des éléments tels que la somme, la requête pour la taille du dossier serait :
db.files.aggregate([
{$match:{ancestors:"src"}},
{$group:{
_id: "src",
total_size: {$sum:"$size"}
}
}
]);
Pour voir la taille de tous les dossiers qui sont dans le dossier racine, ce serait :
db.files.aggregate([
{$match:{ancestors:"root"}},
{$group:{
_id: "root",
total_size: {$sum:"$size"}
}
}
]);