MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Rekursionsabfrage?

Die Frage, welches Schema am besten zu dem von Ihnen beschriebenen Zugriffsmuster passt, wird in einigen Beispielen beantwortet, in denen es darum geht, wie eine Hierarchie in MongoDB/Dokumentendatenbank dargestellt werden kann.

Eine gängige Antwort, die für viele verschiedene Abfragen funktioniert, ist, wo Sie in jeder Datei ihren Namen, ihre Größe, ihr direktes Elternteil und ein Array aller ihrer Vorfahren speichern.

Das würde Ihre Beispieldaten machen:

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 })

Wenn Sie nun Dinge wie „Dateien in diesem Verzeichnis“ oder „alle Dateien in diesem Verzeichnis (einschließlich rekursiv)“ abfragen möchten, fragen Sie Folgendes ab:

db.files.find( { parent: "root" } )    // all files in /src directory
db.files.find( {ancestors: "root"} )   // all files under /root directory tree

Da Sie das Aggregations-Framework verwenden müssen, um Dinge wie Summe zu erhalten, wäre die Abfrage für die Größe des Ordners:

db.files.aggregate([
       {$match:{ancestors:"src"}}, 
       {$group:{
           _id:   "src",
           total_size:  {$sum:"$size"}
          }
       }
]);

Um die Größe aller Ordner zu sehen, die sich im Stammordner befinden, wäre es:

db.files.aggregate([
       {$match:{ancestors:"root"}}, 
       {$group:{
           _id:   "root",
           total_size:  {$sum:"$size"}
          }
       }
]);