Pada intinya, aplikasi web menawarkan kepada penggunanya tampilan ke dalam, dan cara untuk memodifikasi, kumpulan data yang persisten. Apakah mengelola daftar todos, atau memesan mobil untuk menjemput Anda, Anda berinteraksi dengan lapisan data yang permanen namun terus berubah Show
Di Meteor, lapisan data tersebut biasanya disimpan di MongoDB. Satu set data terkait di MongoDB disebut sebagai "kumpulan". Di Meteor Anda mengakses MongoDB melalui , menjadikannya mekanisme persistensi utama untuk data aplikasi Anda Namun, koleksi lebih dari sekadar cara untuk menyimpan dan mengambil data. Mereka juga memberikan inti dari pengalaman pengguna yang interaktif dan terhubung yang diharapkan pengguna dari aplikasi terbaik. Meteor membuat pengalaman pengguna ini mudah diterapkan Dalam artikel ini, kita akan mencermati cara kerja koleksi di berbagai tempat dalam kerangka kerja, dan cara memanfaatkannya secara maksimal Koleksi sisi serverSaat Anda membuat koleksi di server
Anda membuat koleksi di dalam MongoDB, dan antarmuka ke koleksi tersebut untuk digunakan di server. Ini adalah lapisan yang cukup mudah di atas driver Node MongoDB yang mendasarinya, tetapi dengan API sinkron _Koleksi sisi klienDi klien, saat Anda menulis baris yang sama
Itu melakukan sesuatu yang sama sekali berbeda Pada klien, tidak ada koneksi langsung ke database MongoDB, dan sebenarnya API sinkron untuk itu tidak mungkin (atau mungkin yang Anda inginkan). Sebagai gantinya, pada klien, koleksi adalah cache sisi klien dari database. Hal ini dicapai berkat perpustakaan Minimongo—sebuah implementasi dalam memori, semua JS, dari MongoDB API
Cara Anda memindahkan data dari koleksi server (dan yang didukung MongoDB) ke koleksi klien (dalam memori) adalah subjek dari artikel pemuatan data. Secara umum, Anda berlangganan publikasi, yang mendorong data dari server ke klien. Biasanya, Anda dapat berasumsi bahwa klien berisi salinan terbaru dari beberapa subset dari koleksi lengkap MongoDB Untuk menulis data kembali ke server, Anda menggunakan Metode, subjek dari artikel metode Koleksi lokalAda cara ketiga untuk menggunakan koleksi di Meteor. Di klien atau server, jika Anda membuat koleksi dengan salah satu dari dua cara ini _Ini menciptakan koleksi lokal. Ini adalah koleksi Minimongo yang tidak memiliki koneksi database (biasanya koleksi akan terhubung langsung ke database di server, atau melalui langganan di klien) Koleksi lokal adalah cara mudah untuk menggunakan kekuatan penuh perpustakaan Minimongo untuk penyimpanan dalam memori. Misalnya, Anda mungkin menggunakannya sebagai pengganti larik sederhana jika Anda perlu menjalankan kueri kompleks atas data Anda. Atau Anda mungkin ingin memanfaatkan reaktivitasnya pada klien untuk mendorong beberapa UI dengan cara yang terasa alami di Meteor Mendefinisikan skemaMeskipun MongoDB adalah database tanpa skema, yang memungkinkan fleksibilitas maksimum dalam penataan data, umumnya praktik yang baik menggunakan skema untuk membatasi konten koleksi Anda agar sesuai dengan format yang diketahui. Jika tidak, maka Anda cenderung perlu menulis kode defensif untuk memeriksa dan mengonfirmasi struktur data Anda saat keluar dari database, bukan saat masuk ke database. Seperti dalam kebanyakan hal, Anda cenderung membaca data lebih sering daripada menulisnya, sehingga biasanya lebih mudah, dan lebih sedikit buggy untuk menggunakan skema saat menulis Di Meteor, paket skema unggulan adalah paket npm simpl-schema. Ini adalah skema ekspresif berbasis MongoDB yang digunakan untuk menyisipkan dan memperbarui dokumen. Alternatif lain adalah jagi. astronomi yang merupakan lapisan Object Model (OM) lengkap yang menawarkan definisi skema, validator sisi server/klien, metode objek, dan penangan peristiwa Anggaplah kita memiliki koleksi 5. Untuk menentukan skema untuk koleksi ini menggunakan _6, Anda dapat membuat instance baru dari kelas 7 dan melampirkannya ke objek 5 _Contoh dari aplikasi Todos ini mendefinisikan skema dengan beberapa aturan sederhana
Kami melampirkan skema ke namespace 5 secara langsung, yang memungkinkan kami untuk memeriksa objek terhadap skema ini secara langsung kapan pun kami mau, seperti dalam bentuk atau Metode. Di bagian ini kita akan melihat cara menggunakan skema ini secara otomatis saat menulis ke koleksiAnda dapat melihat bahwa dengan kode yang relatif sedikit, kami berhasil membatasi format daftar secara signifikan. Anda dapat membaca lebih lanjut tentang hal-hal yang lebih rumit yang dapat dilakukan dengan skema di dokumen Skema Sederhana Memvalidasi terhadap skemaSekarang kami memiliki skema, bagaimana kami menggunakannya? Cukup mudah untuk memvalidasi dokumen dengan skema. Kita bisa menulis
Dalam hal ini, karena daftar valid menurut skema, baris 4 akan berjalan tanpa masalah. Namun jika, kami menulis
Kemudian panggilan _4 akan memunculkan 6 yang berisi perincian tentang apa yang salah dengan dokumen 7`ValidationError`Apa itu _6? . Biasanya, detail pada _6 digunakan untuk menandai formulir dengan informasi tentang input yang tidak cocok dengan skema. Di , kita akan melihat lebih banyak tentang cara kerjanyaMerancang skema data AndaSekarang setelah Anda terbiasa dengan API dasar Skema Sederhana, ada baiknya mempertimbangkan beberapa batasan sistem data Meteor yang dapat memengaruhi desain skema data Anda. Meskipun secara umum Anda dapat membuat skema data Meteor seperti skema data MongoDB lainnya, ada beberapa detail penting yang perlu diingat Pertimbangan terpenting terkait dengan cara DDP, protokol pemuatan data Meteor, mengkomunikasikan dokumen melalui kabel. Hal utama yang harus disadari adalah bahwa DDP mengirimkan perubahan ke dokumen di tingkat bidang dokumen tingkat atas. Artinya, jika Anda memiliki subbidang yang besar dan kompleks pada dokumen yang sering berubah, DDP dapat mengirim perubahan yang tidak perlu melalui kabel Misalnya, dalam MongoDB "murni" Anda dapat merancang skema sehingga setiap dokumen daftar memiliki bidang bernama 0 yang merupakan larik item todo
Masalah dengan skema ini adalah karena perilaku DDP yang baru saja disebutkan, setiap perubahan pada item todo apa pun dalam daftar akan memerlukan pengiriman seluruh rangkaian todo untuk daftar itu melalui jaringan. Ini karena DDP tidak memiliki konsep "ubah bidang 1 dari item ke-3 di bidang yang disebut 0". Itu hanya dapat "mengubah bidang yang disebut 0 ke array yang benar-benar baru"Denormalisasi dan banyak koleksiImplikasi dari hal di atas adalah kita perlu membuat lebih banyak koleksi untuk memuat sub-dokumen. Dalam kasus aplikasi Todos, kami membutuhkan koleksi 5 dan koleksi 5 untuk memuat setiap daftar item todo. Oleh karena itu, kami perlu melakukan beberapa hal yang biasanya Anda kaitkan dengan database SQL, seperti menggunakan kunci asing ( 6) untuk mengaitkan satu dokumen dengan dokumen lainnyaDi Meteor, sering kali melakukan hal ini lebih sedikit masalah daripada di aplikasi MongoDB pada umumnya, karena mudah untuk menerbitkan kumpulan dokumen yang tumpang tindih (kita mungkin memerlukan satu kumpulan pengguna untuk merender satu layar aplikasi kita, dan kumpulan yang berpotongan . Jadi dalam skenario itu ada keuntungan memisahkan subdokumen dari induknya Namun, mengingat MongoDB sebelum versi 3. 2 tidak mendukung kueri pada banyak koleksi ("bergabung"), kami biasanya harus mendenormalisasi beberapa data kembali ke koleksi induk. Denormalisasi adalah praktik menyimpan potongan informasi yang sama dalam database berkali-kali (berlawanan dengan bentuk "normal" yang tidak berlebihan). MongoDB adalah database tempat denormalisasi didorong, dan dengan demikian dioptimalkan untuk praktik ini Dalam kasus aplikasi Todos, karena kami ingin menampilkan jumlah todos yang belum selesai di sebelah setiap daftar, kami perlu melakukan denormalisasi 7. Ini adalah ketidaknyamanan tetapi biasanya cukup mudah dilakukan seperti yang akan kita lihat di bagian di bawah iniDenormalisasi lain yang terkadang diperlukan oleh arsitektur ini dapat berasal dari dokumen induk ke sub-dokumen. Misalnya, di Todos, karena kami menegakkan privasi daftar todo melalui atribut 8, tetapi kami menerbitkan todos secara terpisah, mungkin masuk akal untuk mendenormalisasi 9 juga. Untuk melakukan ini, kita harus berhati-hati untuk mengambil 2 dari daftar saat membuat todo, dan memperbarui semua todo yang relevan setiap kali daftar 2 berubahMerancang untuk masa depanAplikasi, terutama aplikasi web, jarang selesai, dan sangat berguna untuk mempertimbangkan potensi perubahan di masa mendatang saat mendesain skema data Anda. Seperti dalam kebanyakan hal, menambahkan bidang jarang merupakan ide yang baik sebelum Anda benar-benar membutuhkannya (seringkali apa yang Anda perkirakan tidak benar-benar terjadi pada akhirnya) Namun, sebaiknya pikirkan terlebih dahulu bagaimana skema dapat berubah seiring waktu. Misalnya, Anda mungkin memiliki daftar string pada dokumen (mungkin sekumpulan tag). Meskipun tergoda untuk membiarkannya sebagai subbidang pada dokumen (dengan asumsi mereka tidak banyak berubah), jika ada kemungkinan besar mereka akan menjadi lebih rumit di masa mendatang (mungkin tag akan memiliki pembuat, atau subtag nanti Jumlah pandangan jauh ke depan yang Anda masukkan ke dalam desain skema Anda akan bergantung pada batasan individual aplikasi Anda, dan perlu menjadi keputusan penilaian di pihak Anda Menggunakan skema saat menulisMeskipun ada berbagai cara untuk menjalankan data melalui Skema Sederhana sebelum mengirimkannya ke koleksi Anda (misalnya Anda dapat memeriksa skema di setiap pemanggilan metode), yang paling sederhana dan paling dapat diandalkan adalah menggunakan paket 2 untuk menjalankan setiap Untuk melakukannya, kami menggunakan _4
Artinya, sekarang setiap kali kita memanggil 5, 6, 7, pertama-tama dokumen atau pengubah kita akan diperiksa secara otomatis terhadap skema (dengan cara yang sedikit berbeda tergantung pada mutator yang tepat)`defaultValue` dan pembersihan dataSatu hal yang dilakukan Collection2 adalah sebelum mengirimkannya ke database. Ini termasuk tetapi tidak terbatas pada
Namun, terkadang berguna untuk melakukan inisialisasi yang lebih rumit ke dokumen sebelum memasukkannya ke dalam koleksi. Misalnya, di aplikasi Todos, kami ingin menyetel nama daftar baru menjadi 9 di mana 0 adalah huruf unik berikutnya yang tersediaUntuk melakukannya, kita dapat membuat subkelas 1 dan menulis metode 2 kita sendiri _0Kait saat menyisipkan/memperbarui/menghapusTeknik di atas juga dapat digunakan untuk menyediakan lokasi untuk "menghubungkan" fungsionalitas ekstra ke dalam koleksi. Misalnya, saat menghapus daftar, kami selalu ingin menghapus semua todo-nya secara bersamaan Kita juga dapat menggunakan subkelas untuk kasus ini, menggantikan metode 3 _1Teknik ini memiliki beberapa kelemahan
Cara mengatasi poin 1. dan 2. adalah memisahkan kumpulan kait ke dalam modulnya sendiri, dan menggunakan mutator sebagai titik untuk memanggil modul itu dengan cara yang masuk akal. Kita akan melihat contohnya Poin 3. biasanya dapat diselesaikan dengan menempatkan hook di Metode yang memanggil mutator, bukan di hook itu sendiri. Meskipun ini adalah kompromi yang tidak sempurna (karena kita perlu berhati-hati jika kita menambahkan Metode lain yang memanggil mutator itu di masa mendatang), ini lebih baik daripada menulis sekumpulan kode yang tidak pernah benar-benar dipanggil (yang dijamin tidak akan berfungsi. ), atau memberi kesan bahwa hook Anda lebih umum dari yang sebenarnya Mengabstraksi denormalizerDenormalisasi mungkin perlu terjadi pada berbagai mutator dari beberapa koleksi. Oleh karena itu, masuk akal untuk mendefinisikan logika denormalisasi di satu tempat, dan menghubungkannya ke setiap mutator dengan satu baris kode. Keuntungan dari pendekatan ini adalah logika denormalisasi berada di satu tempat daripada tersebar di banyak file, tetapi Anda masih dapat memeriksa kode untuk setiap kumpulan dan memahami sepenuhnya apa yang terjadi pada setiap pembaruan Dalam aplikasi contoh Todos, kami membuat 4 untuk mengabstraksi penghitungan todos yang tidak lengkap pada daftar. Kode ini perlu dijalankan setiap kali item todo dimasukkan, diperbarui (dicentang atau tidak), atau dihapus. Kodenya terlihat seperti _2Kami kemudian dapat menghubungkan denormalizer ke dalam mutasi koleksi 5 seperti itu _3Perhatikan bahwa kami hanya menangani mutator yang benar-benar kami gunakan dalam aplikasi—kami tidak berurusan dengan semua cara yang memungkinkan jumlah todo pada daftar dapat berubah. Misalnya, jika Anda mengubah _6 pada item todo, Anda perlu mengubah 0 dari dua daftar. Namun, karena aplikasi kami tidak melakukan ini, kami tidak menanganinya di denormalizerBerurusan dengan setiap kemungkinan operator MongoDB sulit dilakukan dengan benar, karena MongoDB memiliki bahasa pengubah yang kaya. Alih-alih, kami fokus menangani pengubah yang kami tahu akan kami lihat di aplikasi kami. Jika ini menjadi terlalu rumit, maka memindahkan pengait untuk logika ke dalam Metode yang benar-benar membuat modifikasi yang relevan bisa masuk akal (walaupun Anda harus rajin memastikan Anda melakukannya di semua tempat yang relevan, baik sekarang maupun saat aplikasi berubah Mungkin masuk akal jika ada paket untuk sepenuhnya mengabstraksi beberapa teknik denormalisasi umum dan benar-benar berusaha menangani semua kemungkinan modifikasi. Jika Anda menulis paket seperti itu, beri tahu kami Bermigrasi ke skema baruSeperti yang telah kita bahas di atas, mencoba memprediksi semua persyaratan skema data Anda di masa mendatang adalah hal yang mustahil. Tak pelak, saat sebuah proyek matang, akan tiba saatnya Anda perlu mengubah skema database. Anda harus berhati-hati tentang cara melakukan migrasi ke skema baru untuk memastikan aplikasi Anda bekerja dengan lancar selama dan setelah migrasi Menulis migrasiPaket yang berguna untuk menulis migrasi adalah 8, yang menyediakan kerangka kerja bagus untuk beralih di antara berbagai versi skema AndaMisalkan, sebagai contoh, kami ingin menambahkan bidang 9, dan memastikan bahwa bidang itu ditetapkan untuk semua daftar yang ada. Kemudian kita dapat menulis yang berikut dalam kode khusus server (mis. g. _0) _4Migrasi ini, yang diurutkan menjadi migrasi pertama yang berjalan di atas database, akan, saat dipanggil, memperbarui setiap daftar dengan hitungan todo saat ini Untuk mengetahui lebih lanjut tentang API dari paket Migrasi, lihat dokumentasinya Perubahan massalJika migrasi Anda perlu mengubah banyak data, dan terutama jika Anda perlu menghentikan server aplikasi Anda saat sedang berjalan, sebaiknya gunakan Operasi Massal MongoDB Keuntungan dari operasi massal adalah hanya memerlukan satu perjalanan pulang pergi ke MongoDB untuk penulisan, yang biasanya berarti jauh lebih cepat. Sisi negatifnya adalah jika migrasi Anda rumit (yang biasanya terjadi jika Anda tidak dapat melakukan 1), diperlukan banyak waktu untuk menyiapkan pembaruan massalArtinya, jika pengguna mengakses situs saat pembaruan sedang disiapkan, kemungkinan besar situs tersebut tidak akan berfungsi. Selain itu, pembaruan massal akan mengunci seluruh koleksi saat sedang diterapkan, yang dapat menyebabkan blip yang signifikan dalam pengalaman pengguna Anda jika perlu beberapa saat. Karena alasan ini, Anda sering kali harus menghentikan server dan memberi tahu pengguna bahwa Anda sedang melakukan pemeliharaan saat pembaruan sedang berlangsung Kami dapat menulis migrasi kami di atas seperti itu (perhatikan bahwa Anda harus menggunakan MongoDB 2. 6 atau lebih baru agar operasi pembaruan massal ada). Kami dapat mengakses API MongoDB asli melalui _5Perhatikan bahwa kami dapat membuat migrasi ini lebih cepat dengan menggunakan Agregasi untuk mengumpulkan kumpulan awal jumlah todo Menjalankan migrasiUntuk menjalankan migrasi terhadap database pengembangan Anda, paling mudah menggunakan shell Meteor _6Jika migrasi mencatat apa pun ke konsol, Anda akan melihatnya di jendela terminal yang menjalankan server Meteor Untuk menjalankan migrasi terhadap basis data produksi Anda, jalankan aplikasi Anda secara lokal dalam mode produksi (dengan setelan produksi dan variabel lingkungan, termasuk setelan basis data), dan gunakan shell Meteor dengan cara yang sama. Apa yang dilakukan adalah menjalankan fungsi _3 dari semua migrasi yang belum selesai, terhadap basis data produksi Anda. Dalam kasus kami, ini harus memastikan semua daftar memiliki kumpulan bidang 4Cara yang baik untuk melakukan hal di atas adalah dengan menjalankan mesin virtual yang dekat dengan database Anda yang telah menginstal Meteor dan akses SSH (instance EC2 khusus yang Anda mulai dan hentikan untuk tujuan tersebut adalah opsi yang masuk akal), dan menjalankan perintah setelah penembakan . Dengan begitu latensi apa pun antara mesin Anda dan database akan dihilangkan, tetapi Anda masih bisa sangat berhati-hati tentang cara menjalankan migrasi Perhatikan bahwa Anda harus selalu membuat cadangan basis data sebelum menjalankan migrasi apa pun Melanggar perubahan skemaTerkadang saat kami mengubah skema aplikasi, kami melakukannya dengan cara yang melanggar – sehingga skema lama tidak berfungsi dengan baik dengan basis kode baru. Misalnya, jika kita memiliki beberapa kode UI yang sangat bergantung pada semua daftar yang memiliki 4, akan ada periode, sebelum migrasi berjalan, di mana UI aplikasi kita akan rusak setelah kita menerapkanCara sederhana untuk mengatasi masalah ini adalah dengan menghentikan aplikasi selama periode antara penerapan dan penyelesaian migrasi. Ini jauh dari ideal, terutama mengingat beberapa migrasi dapat memakan waktu berjam-jam untuk dijalankan (walaupun menggunakan mungkin sangat membantu di sini) Pendekatan yang lebih baik adalah penyebaran multi-tahap. Ide dasarnya adalah itu
Hal lain yang harus diperhatikan, terutama dengan penyebaran multi-tahap seperti itu, adalah penting untuk bersiap untuk melakukan rollback. Untuk alasan ini, paket migrasi memungkinkan Anda menentukan fungsi 9 dan memanggil 0 untuk bermigrasi kembali ke versi 1Jadi jika kami ingin membalikkan migrasi kami di atas, kami akan lari _7Jika Anda merasa perlu mengembalikan versi kode Anda, Anda harus berhati-hati dengan datanya, dan melangkah dengan hati-hati melalui langkah-langkah penerapan Anda secara terbalik PeringatanBeberapa aspek dari strategi migrasi yang diuraikan di atas mungkin bukan cara yang paling ideal untuk melakukan sesuatu (walaupun mungkin sesuai dalam banyak situasi). Berikut adalah beberapa hal lain yang perlu diperhatikan
Menyebarkan "aplikasi migrasi" khusus ke perangkat keras yang sama dengan aplikasi Anda yang sebenarnya mungkin merupakan cara terbaik untuk menyelesaikan masalah di atas. Akan luar biasa jika aplikasi semacam itu melacak migrasi mana yang berjalan, dengan log dan menyediakan UI untuk memeriksa dan menjalankannya. Mungkin aplikasi boilerplate untuk melakukannya dapat dibuat (jika Anda melakukannya, beri tahu kami dan kami akan menautkannya di sini. ) Asosiasi antara koleksiSeperti yang telah kita bahas sebelumnya, sangat umum dalam aplikasi Meteor untuk memiliki asosiasi antar dokumen dalam koleksi yang berbeda. Akibatnya, sangat umum juga untuk menulis kueri yang mengambil dokumen terkait setelah Anda memiliki dokumen yang Anda minati (misalnya semua todo yang ada dalam satu daftar) Untuk membuatnya lebih mudah, kita dapat melampirkan fungsi ke prototipe dokumen milik koleksi tertentu, untuk memberi kita "metode" pada dokumen (dalam pengertian berorientasi objek). Kami kemudian dapat menggunakan metode ini untuk membuat kueri baru untuk menemukan dokumen terkait Untuk membuatnya lebih mudah, kita dapat menggunakan paket 2 untuk mengaitkan koleksi dan mengambil relasinya. Sebagai contoh _8Ini memungkinkan kami untuk mengambil daftar dengan benar beserta todo-nya _9 3 akan terlihat seperti ini 0Grapher mendukung kueri isomorfik (reaktif dan non-reaktif), memiliki fitur keamanan bawaan, bekerja dengan banyak jenis hubungan, dan banyak lagi. Lihat dokumentasi Grapher untuk detail lebih lanjut Pembantu koleksiKita dapat menggunakan paket 4 untuk dengan mudah melampirkan metode tersebut (atau "pembantu") ke dokumen. Contohnya _1Setelah kami melampirkan pembantu ini ke koleksi 5, setiap kali kami mengambil daftar dari database (di klien atau server), fungsi 6 akan tersedia
Bagaimana cara memeriksa skema pengumpulan di MongoDB?Periksa Skema MongoDB dengan Schema Explorer . Klik kanan – Klik kanan pada koneksi apa pun di Pohon Koneksi dan pilih Analisis Skema Tombol – Pilih koleksi dan klik Skema di toolbar global Apakah ada skema di MongoDB?MongoDB menggunakan model skema yang fleksibel , yang berarti bahwa dokumen dalam kumpulan tidak perlu memiliki bidang atau tipe data yang sama secara default. Setelah membuat skema aplikasi, Anda dapat menggunakan validasi skema untuk memastikan tidak ada perubahan skema yang tidak diinginkan atau tipe data yang tidak tepat.
Bagaimana cara melihat skema di Kompas MongoDB?Klik nilai bagan. Dalam tampilan Skema, Anda bisa mengklik nilai bagan untuk menyusun kueri. . Opsional. Pilih beberapa nilai. . Opsional. Klik pada nilai bidang lain untuk membuat kueri gabungan. . Opsional. Batalkan pilihan nilai. . Jalankan kueri. Untuk menjalankan kueri, klik Analisis Apa itu skema MongoDB?Apa itu Skema? . Anda dapat menggunakan skema BSON Layanan Aplikasi Atlas, yang memperluas standar Skema JSON, untuk menentukan model data aplikasi Anda dan memvalidasi dokumen setiap kali dibuat, diubah, atau dihapus. a JSON object that defines the the structure and contents of your data. You can use Atlas App Services' BSON schemas, which extend the JSON Schema standard, to define your application's data model and validate documents whenever they're created, changed, or deleted. |