sql >> Database >  >> NoSQL >> MongoDB

Recursie vraag?

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"}
          }
       }
]);



  1. Het valideren van de uniciteit van een ingesloten document dat door het bovenliggende document in mangoest wordt begrensd

  2. Wil je Redis gebruiken als een opslag voor evenementenstatistieken

  3. Controleren of een waarde al in een lijst bestaat Redis

  4. mongodb maakt 80+ bestanden van elk 2 GB terwijl de database leeg is