MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Zapytanie rekurencyjne?

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



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. zmiana typu mongodb na tablicę

  2. MongoDB nie może przeanalizować zapytania (2dsphere):dwa warunki

  3. Jak reaktywnie agregować mongodb w meteor

  4. Jak przekonwertować rok i tydzień roku uzyskany z zapytania MongoDB na datetime Joda?

  5. Wystąpił limit czasu po wybraniu serwera przez 30000 ms za pomocą CompositeServerSelector