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!