MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Agregasi MongoDB Menggunakan Java

1. Ikhtisar

Dalam tutorial ini, kita akan mempelajari kerangka kerja Agregasi MongoDB menggunakan driver Java MongoDB .

Pertama-tama kita akan melihat apa arti agregasi secara konseptual, dan kemudian menyiapkan kumpulan data. Terakhir, kita akan melihat berbagai teknik agregasi beraksi menggunakan Pembuat Agregat .

2. Apa itu Agregasi?

Agregasi digunakan di MongoDB untuk menganalisis data dan memperoleh informasi yang berarti darinya .

Ini biasanya dilakukan dalam berbagai tahapan, dan tahapan tersebut membentuk jalur pipa – sehingga keluaran dari satu tahapan diteruskan sebagai masukan ke tahapan berikutnya.

Tahapan yang paling umum digunakan dapat diringkas sebagai:

Panggung Setara dengan SQL Deskripsi
 proyek PILIH hanya memilih bidang yang diperlukan, juga dapat digunakan untuk menghitung dan menambahkan bidang turunan ke koleksi
 cocok WHERE memfilter koleksi sesuai kriteria yang ditentukan
 grup GROUP BY mengumpulkan input bersama sesuai dengan kriteria yang ditentukan (mis. count, sum) untuk mengembalikan dokumen untuk setiap pengelompokan yang berbeda
 sort PESAN OLEH mengurutkan hasil dalam urutan menaik atau menurun dari bidang tertentu
 hitung COUNT menghitung dokumen yang berisi koleksi
 batas LIMIT membatasi hasil ke sejumlah dokumen tertentu, alih-alih mengembalikan seluruh koleksi
 keluar PILIH KE NEW_TABLE menulis hasilnya ke koleksi bernama; tahap ini hanya dapat diterima sebagai yang terakhir dalam alur


Setara SQL untuk setiap tahap agregasi disertakan di atas untuk memberi kita gambaran tentang arti operasi tersebut di dunia SQL.

Kita akan segera melihat contoh kode Java untuk semua tahapan ini. Tapi sebelum itu, kita membutuhkan database.

3. Penyiapan Basis Data

3.1. Kumpulan data

Persyaratan pertama dan terpenting untuk mempelajari apa pun yang terkait dengan basis data adalah kumpulan data itu sendiri!

Untuk tujuan tutorial ini, kami akan menggunakan titik akhir API tenang yang tersedia untuk umum yang menyediakan informasi komprehensif tentang semua negara di dunia. API ini memberi kami banyak titik data untuk suatu negara dalam format JSON yang nyaman . Beberapa bidang yang akan kami gunakan dalam analisis kami adalah:

  • nama - nama negara; misalnya, Amerika Serikat
  • alpha3Code – kode pendek untuk nama negara; misalnya, IND (untuk India)
  • wilayah – wilayah negara itu berada; misalnya, Eropa
  • daerah – wilayah geografis negara
  • bahasa – bahasa resmi negara dalam format larik; misalnya, Bahasa Inggris
  • perbatasan – serangkaian alpha3Code negara tetangga s

Sekarang mari kita lihat cara mengonversi data ini menjadi koleksi di database MongoDB .

3.2. Mengimpor ke MongoDB

Pertama, kita perlu menekan titik akhir API untuk mendapatkan semua negara dan menyimpan respons secara lokal dalam file JSON . Langkah selanjutnya adalah mengimpornya ke MongoDB menggunakan mongoimport perintah:

mongoimport.exe --db <db_name> --collection <collection_name> --file <path_to_file> --jsonArray

Impor yang berhasil akan memberi kami koleksi dengan 250 dokumen.

4. Contoh Agregasi di Java

Sekarang setelah kita mengetahui dasar-dasarnya, mari kita mendapatkan beberapa wawasan yang berarti dari data yang kita miliki untuk semua negara . Kami akan menggunakan beberapa pengujian JUnit untuk tujuan ini.

Tapi sebelum kita melakukannya, kita perlu membuat koneksi ke database:

@BeforeClass
public static void setUpDB() throws IOException {
    mongoClient = MongoClients.create();
    database = mongoClient.getDatabase(DATABASE);
    collection = database.getCollection(COLLECTION);
}

Dalam semua contoh berikut, kita akan menggunakan Agregat kelas pembantu yang disediakan oleh driver Java MongoDB.

Untuk keterbacaan yang lebih baik dari cuplikan kami, kami dapat menambahkan impor statis:

import static com.mongodb.client.model.Aggregates.*;

4.1. cocok dan hitung

Untuk memulainya, mari kita mulai dengan sesuatu yang sederhana. Sebelumnya kami mencatat bahwa kumpulan data berisi informasi tentang bahasa.

Sekarang, katakanlah kita ingin memeriksa jumlah negara di dunia yang menggunakan bahasa Inggris sebagai bahasa resmi :

@Test
public void givenCountryCollection_whenEnglishSpeakingCountriesCounted_thenNinetyOne() {
    Document englishSpeakingCountries = collection.aggregate(Arrays.asList(
      match(Filters.eq("languages.name", "English")),
      count())).first();
    
    assertEquals(91, englishSpeakingCountries.get("count"));
}

Di sini kami menggunakan dua tahap dalam alur agregasi kami:cocok dan hitung .

Pertama, kami memfilter koleksi agar hanya cocok dengan dokumen yang berisi Bahasa Inggris dalam bahasa their mereka bidang. Dokumen-dokumen ini dapat dibayangkan sebagai koleksi sementara atau antara yang menjadi masukan untuk tahap kami selanjutnya, hitung. Ini menghitung jumlah dokumen pada tahap sebelumnya.

Hal lain yang perlu diperhatikan dalam contoh ini adalah penggunaan metode pertama . Karena kita tahu bahwa output dari tahap terakhir, hitung , akan menjadi catatan tunggal, ini adalah cara yang dijamin untuk mengekstrak satu-satunya dokumen yang dihasilkan.

4.2. grup (dengan jumlah ) dan urutkan

Dalam contoh ini, tujuan kami adalah menemukan wilayah geografis yang berisi jumlah negara maksimum :

@Test
public void givenCountryCollection_whenCountedRegionWise_thenMaxInAfrica() {
    Document maxCountriedRegion = collection.aggregate(Arrays.asList(
      group("$region", Accumulators.sum("tally", 1)),
      sort(Sorts.descending("tally")))).first();
    
    assertTrue(maxCountriedRegion.containsValue("Africa"));
}

Seperti yang terlihat, kami menggunakan grup dan urutkan untuk mencapai tujuan kami di sini .

Pertama, kami mengumpulkan jumlah negara di setiap wilayah dengan mengumpulkan jumlah kemunculannya dalam variabel penghitungan. Ini memberi kita kumpulan dokumen perantara, masing-masing berisi dua bidang:wilayah dan jumlah negara di dalamnya. Kemudian kami mengurutkannya dalam urutan menurun dan mengekstrak dokumen pertama untuk memberi kami wilayah dengan negara maksimum.

4.3. urutkan, batas, dan keluar

Sekarang mari kita gunakan sort , batas dan keluar untuk mengekstrak tujuh negara terbesar berdasarkan wilayah dan menuliskannya ke dalam koleksi baru :

@Test
public void givenCountryCollection_whenAreaSortedDescending_thenSuccess() {
    collection.aggregate(Arrays.asList(
      sort(Sorts.descending("area")), 
      limit(7),
      out("largest_seven"))).toCollection();

    MongoCollection<Document> largestSeven = database.getCollection("largest_seven");

    assertEquals(7, largestSeven.countDocuments());

    Document usa = largestSeven.find(Filters.eq("alpha3Code", "USA")).first();

    assertNotNull(usa);
}

Di sini, pertama-tama kita mengurutkan koleksi yang diberikan dalam urutan area. Kemudian, kami menggunakan Aggregates#limit metode untuk membatasi hasil ke tujuh dokumen saja. Akhirnya, kami menggunakan out tahap deserialize data ini menjadi koleksi baru yang disebut largest_seven . Koleksi ini sekarang dapat digunakan dengan cara yang sama seperti yang lain – misalnya, untuk menemukan jika berisi AS.

4.4. proyek, grup (dengan maksimal), cocok

Dalam sampel terakhir kami, mari kita coba sesuatu yang lebih rumit. Katakanlah kita perlu mencari tahu berapa banyak perbatasan yang dibagikan setiap negara dengan negara lain, dan berapa jumlah maksimumnya .

Sekarang di dataset kami, kami memiliki batas bidang, yang merupakan daftar larik alpha3Code s untuk semua negara yang berbatasan, tetapi tidak ada bidang yang secara langsung memberi kami hitungan. Jadi kita perlu menurunkan jumlah negara perbatasan menggunakan proyek :

@Test
public void givenCountryCollection_whenNeighborsCalculated_thenMaxIsFifteenInChina() {
    Bson borderingCountriesCollection = project(Projections.fields(Projections.excludeId(), 
      Projections.include("name"), Projections.computed("borderingCountries", 
        Projections.computed("$size", "$borders"))));
    
    int maxValue = collection.aggregate(Arrays.asList(borderingCountriesCollection, 
      group(null, Accumulators.max("max", "$borderingCountries"))))
      .first().getInteger("max");

    assertEquals(15, maxValue);

    Document maxNeighboredCountry = collection.aggregate(Arrays.asList(borderingCountriesCollection,
      match(Filters.eq("borderingCountries", maxValue)))).first();
       
    assertTrue(maxNeighboredCountry.containsValue("China"));
}

Setelah itu, seperti yang kita lihat sebelumnya, kita akan mengelompokkan koleksi yang diproyeksikan untuk menemukan maks nilai negara yang berbatasan . Satu hal yang perlu ditunjukkan di sini adalah maks akumulator memberi kita nilai maksimum sebagai angka , bukan seluruh Dokumen mengandung nilai maksimum. Kita perlu melakukan pertandingan untuk menyaring Dokumen yang diinginkan jika ada operasi lebih lanjut yang akan dilakukan.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Bagaimana DAN dan TIDAK di MongoDB $pencarian teks

  2. MongoDB:locale::facet::_S_create_c_nama lokal tidak valid

  3. Populasi luwak tertanam

  4. Mengapa tidak disarankan untuk menggunakan fungsi tersimpan sisi server di MongoDB?

  5. Bagaimana cara membandingkan 2 koleksi mongodb?