Buka webinar "Dasar-dasar MongoDB"

Teman-teman, peluncuran kursus Database berikutnya akan berlangsung besok, jadi kami mengadakan pelajaran terbuka tradisional, sebuah rekaman yang dapat Anda lihat di sini . Kali ini kami berbicara tentang database MongoDB yang populer: kami mempelajari beberapa seluk-beluk, memeriksa dasar-dasar pekerjaan, fitur dan arsitektur. Dan juga menyentuh beberapa Kasus Pengguna.



Webinar ini dilakukan oleh Ivan Remen , kepala pengembangan server di Citimobil.


Fitur MongoDB


MongoDB adalah sistem manajemen basis data berorientasi dokumen open source yang tidak memerlukan deskripsi skema tabel. Itu diklasifikasikan sebagai NoSQL dan menggunakan BSON (binary JSON). Keluar dari kotak, ditulis dalam C ++ dan mendukung sintaks JavaScript. Tidak ada dukungan SQL.

MongoDB memiliki driver untuk banyak bahasa pemrograman populer (C, C ++, C #, Go, Java, JavaScript, Perl, PHP, Python, Ruby, dll.). Ada juga driver tidak resmi dan yang didukung komunitas untuk bahasa pemrograman lain.

Baiklah, mari kita lihat perintah dasar yang mungkin berguna.

Jadi, untuk menggunakan MongoDB di Docker , kami menulis:

docker run -it --rm -p 127.0.0.1:27017:27017 --name mongo-exp-project mongo docker exec -it mongo-exp-project mongo 

Dengan demikian, klien MongoDB memulai :



Sekarang mari kita menulis Hello World tradisional:

 print (β€œHello world!”) 



Setelah itu, jalankan loop :



Seperti yang Anda perhatikan, kami memiliki JS reguler di depan kami, dan MongoDB adalah penerjemah JavaScript lengkap .

Kapan menggunakan MongoDB?


Ada cerita bahwa rata-rata startup di Silicon Valley adalah pria yang membuka buku "HTML for Dummies" seminggu yang lalu. Stack mana yang akan dia pilih? Setuju bahwa itu sangat nyaman baginya ketika dia memiliki JavaScript di browser-nya untuk alasan yang jelas, Node.js berputar di server, dan JavaScript juga ada di database. Ini adalah poin nomor 1.

Kedua, ada presentasi yang sangat baik oleh Peter Zaitsev, salah satu pakar basis data terbaik di Rusia. Di dalamnya, Peter berbicara tentang MySQL dan MongoDB, berfokus pada kapan dan apa yang terbaik untuk digunakan.

Ketiga, saya ingin menekankan bahwa MongoDB ditandai oleh skalabilitas yang baik - dan ini adalah salah satu fitur utama dari database. Jika Anda tidak tahu sebelumnya apa muatannya, MongoDB sempurna. Selain itu, ini mendukung pola seperti di luar kotak sebagai sharding dan replikasi , dan semua ini dibuat cukup transparan, yaitu, sangat nyaman untuk bekerja.

Adapun terminologi dalam MongoDB, maka:

  • basis adalah basis (skema, totalitas tabel);
  • dalam MongoDB ada yang namanya koleksi - itu adalah analog dari sebuah tabel dan seperangkat dokumen yang harus dihubungkan sesuai dengan logika sesuatu;
  • dokumen adalah analog dari suatu baris.

Pembuatan basis data dan permintaan sederhana


Untuk membuat database, Anda hanya perlu mulai menggunakannya:

 use learn 



Sekarang buat sedikit sisipan dokumen. Biarkan saja, misalnya, unicorn bernama Aurora:

 db.unicorns.insert({name: 'Aurora', gender: 'f', weight: 450}) 

db adalah objek global untuk mengakses basis data, yaitu, sebenarnya, "monga" itu sendiri. Untuk sharding, sh digunakan, untuk replikasi, rs digunakan .

Perintah apa yang dimiliki objek db :



Jadi, kembali ke tim kami, akibatnya konsol akan melaporkan bahwa satu baris dimasukkan:



Kata unicorns di db.unicorns.insert({name: 'Aurora', gender: 'f', weight: 450}) menunjuk koleksi. Harap dicatat di sini bahwa kami tidak mendeskripsikan atau membuat koleksi, tetapi hanya menulis 'unicorn', membuat insert, dan kami mendapat koleksi.

Dan jadi kami bisa mendapatkan semua koleksi kami :

 db.getCollectionNames() 

Baik dan sebagainya. Kami dapat memasukkan koleksi lain :



Sekarang kami akan meminta koleksi lengkap (kami ingat bahwa dalam kasus kami database sudah berisi informasi tentang dua unicorn dengan nama yang sama):

 db.unicorns.find() 

Harap perhatikan, ini JSON kami (ada nama, jenis kelamin, berat, beberapa pengenal unik objek):



Sekarang mari kita masukkan beberapa unicorn dengan nama yang sama:

 db.unicorns.insert({name: 'Leto', gender: 'm', home: 'Arrakeen', worm: false}) db.unicorns.insert({name: 'Leto', gender: 'm', home: 'Arrakeen', worm: false}) 

Dan mari kita lihat apa yang terjadi:



Seperti yang Anda lihat, kami memiliki bidang tambahan: rumah dan cacing , yang tidak dimiliki Aurora.

Tambahkan beberapa unicorn:

 db.unicorns.insertMany([{name: 'Horny', dob: new Date(1992,2,13,7,47), loves: ['carrot','papaya'], weight: 600, gender: 'm', vampires: 63}, {name: 'Aurora', dob: new Date(1991, 0, 24, 13, 0), loves: ['carrot', 'grape'], weight: 450, gender: 'f', vampires: 43}, {name: 'Unicrom', dob: new Date(1973, 1, 9, 22, 10), loves: ['energon', 'redbull'], weight: 984, gender: 'm', vampires: 182}, {name: 'Roooooodles', dob: new Date(1979, 7, 18, 18, 44), loves: ['apple'], weight: 575, gender: 'm', vampires: 99}]) 

Jadi, kami memasukkan empat objek lagi menggunakan JavaScript:



Menurut Anda di basis data mana lebih mudah menyimpan data paspor: di basis data relasional atau di mong?

Jawabannya jelas - dalam mong, dan contoh di atas menunjukkannya dengan baik. Bukan rahasia lagi bahwa KLADR menyakitkan di Federasi Rusia. Dan monga sangat baik jatuh pada alamat, karena Anda dapat menentukan semuanya sebagai array, dan itu akan jauh lebih mudah untuk hidup. Dan ini adalah Kasus Pengguna yang bagus untuk MongoDB .

Tambahkan lebih banyak unicorn:

 db.unicorns.insert({name: 'Solnara', dob: new Date(1985, 6, 4, 2, 1), loves:['apple', 'carrot', 'chocolate'], weight:550, gender:'f', vampires:80}); db.unicorns.insert({name:'Ayna', dob: new Date(1998, 2, 7, 8, 30), loves: ['strawberry', 'lemon'], weight: 733, gender: 'f', vampires: 40}); db.unicorns.insert({name:'Kenny', dob: new Date(1997, 6, 1, 10, 42), loves: ['grape', 'lemon'], weight: 690, gender: 'm', vampires: 39}); db.unicorns.insert({name: 'Raleigh', dob: new Date(2005, 4, 3, 0, 57), loves: ['apple', 'sugar'], weight: 421, gender: 'm', vampires: 2}); db.unicorns.insert({name: 'Leia', dob: new Date(2001, 9, 8, 14, 53), loves: ['apple', 'watermelon'], weight: 601, gender: 'f', vampires: 33}); db.unicorns.insert({name: 'Pilot', dob: new Date(1997, 2, 1, 5, 3), loves: ['apple', 'watermelon'], weight: 650, gender: 'm', vampires: 54}); db.unicorns.insert({name: 'Nimue', dob: new Date(1999, 11, 20, 16, 15), loves: ['grape', 'carrot'], weight: 540, gender: 'f'}); db.unicorns.insert({name: 'Dunx', dob: new Date(1976, 6, 18, 18, 18), loves: ['grape', 'watermelon'], weight: 704, gender: 'm', vampires: 165}); 



Sekarang perhatikan dokumennya. Sebagai dob , kami menyimpan seluruh benda. Dan ada juga informasi yang disukai unicorn, dan tidak semua orang memiliki data ini. Jadi, di dalamnya adalah array penuh .

Omong-omong, untuk hasil yang lebih indah, Anda bisa memanggil metode .pretty() di akhir perintah pencarian:



Jika Anda perlu mendapatkan informasi tentang kesalahan terakhir , gunakan perintah berikut:

 db.getLastError() 

Ini dapat dilakukan setelah setiap penyisipan, atau Anda dapat mengonfigurasi Write Concern. Lebih baik untuk membacanya di dokumentasi resmi , yang, omong-omong, sangat informatif di mong. Ngomong-ngomong, ada juga artikel bagus tentang HabrΓ© tentang ini.

Pindah ke pertanyaan yang lebih kompleks


Permintaan nilai bidang yang tepat:

 db.unicorns.find({gender: 'm'}) 

Dengan menulis permintaan seperti itu, kita mendapatkan di daftar konsol semua unicorn pria pada output di konsol.

Anda juga dapat menjalankan kueri langsung di beberapa bidang : berdasarkan jenis kelamin dan berdasarkan berat:



Di atas, perhatikan pemilih $ gt khusus, yang memungkinkan Anda menampilkan semua unicorn jantan dengan berat lebih dari 700.

Anda dapat memeriksa apakah bidang ada sama sekali :

 db.unicorns.find({vampires: {$exists: false}}) 

Atau lebih:

 db.unicorns.find({'parents.father': {$exists: true}}) 

Perintah berikut menampilkan unicorn yang namanya dimulai dengan huruf A atau a:

 db.unicorns.find({name: {$regex: "^[Aa]"}}) 

Sekarang mari kita lihat pencarian array . Pertanyaan nomor 1: apa yang akan dihasilkan perintah ini:

 db.unicorns.find({loves:'apple'}) 

Itu benar: semua orang yang mencintai apel.

Perintah berikut hanya akan mengembalikan data unicorn yang hanya berisi apel dan semangka:

 db.unicorns.find({loves:[ "apple", "watermelon" ]}) 

Dan satu perintah lagi:

 db.unicorns.find({loves:[ "watermelon", "apple" ]}) 

Dalam kasus kami, ia tidak akan mengembalikan apa pun, karena ketika kami melewatkan array, elemen pertama dibandingkan dengan yang pertama, yang kedua dengan yang kedua, dll. Artinya, array juga harus bertepatan di posisi nilai-nilai ini.

Dan inilah tampilan pencarian array menggunakan operator OR :



Contoh berikut akan menunjukkan kepada kita pencarian menggunakan operator $ all . Dan di sini urutannya sudah tidak berprinsip:



Kami juga dapat mencari berdasarkan ukuran array:



Tetapi bagaimana jika kita ingin menemukan array yang lebih besar dari satu? Ada $ di mana operator untuk ini, dengan mana Anda dapat menulis hal-hal yang lebih kompleks:

 db.unicorns.find({$where: function() { return this.loves && (this.loves.length > 1) } }) 

Omong-omong, jika Anda ingin berlatih, ini adalah file dengan perintah.

Fitur Kursor


Mari kita sedikit menyimpang dan mengatakan beberapa kata tentang fitur monga:

  • find () dan operasi lainnya tidak mengembalikan data - mereka mengembalikan apa yang disebut "kursor";
  • apa yang kita lihat ketika data dicetak adalah karya penerjemah.

Dengan mengetikkan db.unicorns.find tanpa tanda kurung, kami mendapatkan petunjuk:



Kami terus memenuhi permintaan


Ada juga operator $ in:

 db.unicorns.find({weight: {$in: [650, 704]}}) 



Sekarang mari kita bicara tentang pembaruan . Misalnya, mari kita ubah berat Roooooodles unicorn:

 db.unicorns.update({name: "Roooooodles"}, {weight: 2222}) 

Sebagai hasil dari tindakan kami, dokumen akan sepenuhnya diperbarui , dan hanya satu bidang yang ditentukan akan tetap ada di dalamnya:



Artinya, satu-satunya hal yang tersisa dengan objek kami adalah bobot 2222 dan, tentu saja, id.

Anda dapat memperbaikinya dengan $ set :

 db.unicorns.update({_id: ObjectId("5da6ea4d9703b8be0089e6db")}, {$set: { "name" : "Roooooodles", "dob" : ISODate("1979-08-18T18:44:00Z"), "loves" : [ "apple" ], "gender" : "m", "vampires" : 99}}) 




Dimungkinkan juga untuk menambah nilai :



Ada juga upsert - kombinasi pembaruan dan masukkan:



Dan inilah cara memilih bidang :





Tetap menambahkan beberapa kata tentang lewati dan batasi :



Kolega, itu saja, jika Anda ingin mengetahui detailnya, tonton seluruh video . Dan jangan lupa untuk meninggalkan komentar Anda!

Source: https://habr.com/ru/post/id474054/


All Articles