MongoDB bilan ishlashni boshlashdan oldin bilmoqchi bo'lgan 14 ta narsa

Maqolaning tarjimasi kurs boshlanishi arafasida tayyorlangan "Aloqaviy bo'lmagan ma'lumotlar bazalari".

MongoDB bilan ishlashni boshlashdan oldin bilmoqchi bo'lgan 14 ta narsa

Muhim:

  • MongoDB-da ixtiyoriy bo'lsa ham, sxemani ishlab chiqish juda muhimdir.
  • Xuddi shunday, indekslar sizning sxema va kirish naqshlaringizga mos kelishi kerak.
  • Katta ob'ektlar va katta massivlardan foydalanishdan saqlaning.
  • MongoDB sozlamalari bilan ehtiyot bo'ling, ayniqsa xavfsizlik va ishonchlilik haqida gap ketganda.
  • MongoDB-da so'rovlar optimallashtiruvchisi yo'q, shuning uchun so'rov operatsiyalarini bajarishda ehtiyot bo'lishingiz kerak.

Men juda uzoq vaqtdan beri ma'lumotlar bazalari bilan ishlayapman, lekin MongoDB-ni yaqinda kashf qildim. U bilan ishlashni boshlashdan oldin bilmoqchi bo'lgan bir nechta narsalar bor. Agar biror kishi ma'lum bir sohada tajribaga ega bo'lsa, ular ma'lumotlar bazalari nima va ular nima qilishlari haqida oldindan tasavvurga ega. Boshqalar tushunishini osonlashtirish umidida men keng tarqalgan xatolar ro'yxatini taqdim etaman.

MongoDB serverini autentifikatsiyasiz yaratish

Afsuski, MongoDB sukut bo'yicha autentifikatsiyasiz o'rnatiladi. Mahalliy ravishda foydalaniladigan ish stantsiyasi uchun bu amaliyot odatiy hisoblanadi. Ammo MongoDB ko'p foydalanuvchili tizim bo'lib, katta hajmdagi xotiradan foydalanishni yaxshi ko'radi, uni faqat ishlab chiqish uchun ishlatmoqchi bo'lsangiz ham, iloji boricha ko'proq operativ xotiraga ega serverga qo'ysangiz yaxshi bo'ladi. Standart port orqali serverga o'rnatish muammoli bo'lishi mumkin, ayniqsa so'rovda har qanday JavaScript kodi bajarilishi mumkin bo'lsa (masalan, $where uchun g'oya sifatida in'ektsiyalar).

Bir nechta autentifikatsiya usullari mavjud, ammo eng osoni foydalanuvchi identifikatorini/parolini o'rnatishdir. Ushbu g'oyaga asoslangan ajoyib autentifikatsiya haqida o'ylaganingizda foydalaning LDAP. Xavfsizlik haqida gap ketganda, MongoDB doimiy ravishda yangilanishi kerak va jurnallar har doim ruxsatsiz kirish uchun tekshirilishi kerak. Masalan, men boshqa portni standart port sifatida tanlashni yoqtiraman.

Hujum yuzasini MongoDB bilan bog'lashni unutmang

MongoDB xavfsizligini tekshirish ro'yxati Tarmoqqa kirish va ma'lumotlar sizib chiqishi xavfini kamaytirish uchun yaxshi maslahatlarni o'z ichiga oladi. Uni yo'q qilish va ishlab chiqish serveri yuqori darajadagi xavfsizlikka muhtoj emasligini aytish oson. Biroq, bu unchalik oddiy emas va bu barcha MongoDB serverlariga tegishli. Xususan, agar foydalanish uchun jiddiy sabab bo'lmasa mapReduce, group yoki $ qayerda, konfiguratsiya faylida yozish orqali JavaScript-da o'zboshimchalik kodidan foydalanishni o'chirib qo'yishingiz kerak javascriptEnabled:false. Ma'lumotlar fayllari standart MongoDB da shifrlanmaganligi sababli, MongoDB bilan ishlash mantiqiy Maxsus foydalanuvchi, fayllarga to'liq kirish huquqiga ega bo'lgan, faqat unga cheklangan kirish va operatsion tizimning o'z fayllarga kirishni boshqarish vositalaridan foydalanish imkoniyati.

Sxemani ishlab chiqishda xato

MongoDB sxemadan foydalanmaydi. Ammo bu sxema kerak emas degani emas. Agar siz hujjatlarni hech qanday izchil naqshsiz saqlashni istasangiz, ularni saqlash tez va oson bo'lishi mumkin, lekin ularni keyinroq olish qiyin bo'lishi mumkin. la'nati qattiq.

Klassik maqola "MongoDB sxemalarini loyihalash uchun 6 ta asosiy qoidalar" Bu o'qishga arziydi va shunga o'xshash xususiyatlar Sxema Explorer uchinchi tomon Studio 3T vositasida, kontaktlarning zanglashiga olib keladigan muntazam tekshiruvlar uchun foydalanishga arziydi.

Saralash tartibini unutmang

Saralash tartibini unutish boshqa noto'g'ri konfiguratsiyaga qaraganda ko'proq umidsizlikka olib kelishi va ko'proq vaqt sarflashi mumkin. Odatiy bo'lib MongoBD foydalanadi ikkilik tartiblash. Ammo bu hech kimga foydali bo'lishi dargumon. O'tgan asrning 80-yillarida munchoqlar, kaftanlar va jingalak mo'ylovlar bilan bir qatorda katta-kichik harflar, urg'u sezgir, binar turlari qiziq anaxronizmlar hisoblangan. Endi ulardan foydalanish kechirilmaydi. Haqiqiy hayotda "mototsikl" "mototsikl" bilan bir xil. Va "Britaniya" va "Britaniya" bir xil joy. Kichik harf shunchaki bosh harfning katta ekvivalentidir. Va meni diakritiklarni saralashga majburlamang. MongoDB-da ma'lumotlar bazasini yaratishda, urg'u sezgir bo'lmagan birikmalardan foydalaning va ro'yxatdan o'tish, qaysi tilga mos keladi va tizim foydalanuvchi madaniyati. Bu string ma'lumotlarini qidirishni ancha osonlashtiradi.

Katta hujjatlar bilan to'plamlar yarating

MongoDB to'plamlarda 16 MB gacha bo'lgan katta hujjatlarni joylashtirishdan mamnun va GridFS 16 MB dan katta hajmdagi hujjatlar uchun mo'ljallangan. Ammo u erda katta hujjatlar joylashtirilishi mumkinligi sababli ularni saqlash yaxshi fikr emas. Agar siz bir necha kilobayt o'lchamdagi alohida hujjatlarni saqlasangiz, ularni keng SQL jadvalidagi qatorlar kabi ko'rib chiqsangiz, MongoDB yaxshi ishlaydi. Katta hujjatlar bilan muammolar manbai bo'ladi hosildorlik.

Katta massivli hujjatlarni yaratish

Hujjatlar massivlarni o'z ichiga olishi mumkin. Massivdagi elementlar soni to'rt xonali sondan uzoqda bo'lsa yaxshi bo'ladi. Agar massivga elementlar tez-tez qo'shilsa, u o'z ichiga olgan hujjatdan oshib ketadi va shunday bo'lishi kerak bo'ladi. harakat qilish, bu zarur bo'lishini anglatadi indekslarni ham yangilang. Hujjatni katta massiv bilan qayta indekslashda indekslar ko'pincha qayta yoziladi, chunki Kirish, uning indeksini saqlaydi. Ushbu qayta indeksatsiya hujjat kiritilganda yoki o'chirilganda ham sodir bo'ladi.

MongoDB deb nomlangan narsa bor "to'ldirish omili", bu muammoni minimallashtirish uchun hujjatlarni ko'paytirish uchun joy beradi.
Siz massivni indekslashsiz qila olasiz deb o'ylashingiz mumkin. Afsuski, indekslarning etishmasligi sizda boshqa muammolarga olib kelishi mumkin. Hujjatlar boshidan oxirigacha skanerlanganligi sababli, massiv oxiridagi elementlarni izlash ko'proq vaqt oladi va bunday hujjat bilan bog'liq bo'lgan ko'pgina operatsiyalar sekin.

Shuni unutmangki, yig'ilishdagi bosqichlarning tartibi muhim ahamiyatga ega

So'rovlar optimallashtiruvchisi bo'lgan ma'lumotlar bazasi tizimida siz yozgan so'rovlar uni qanday olish kerakligini emas, balki nimani olishni xohlayotganingizni tushuntirishdir. Ushbu mexanizm restoranda buyurtma berish bilan o'xshash ishlaydi: odatda siz shunchaki taomga buyurtma berasiz va oshpazga batafsil ko'rsatmalar bermaysiz.

MongoDB-da siz oshpazga ko'rsatma berasiz. Misol uchun, ma'lumotlarning o'tishiga ishonch hosil qilishingiz kerak reduce yordamida quvur liniyasida imkon qadar erta $match и $project, va tartiblash faqat keyin sodir bo'ladi reduce, va qidiruv aynan sizga kerak bo'lgan tartibda sodir bo'ladi. Keraksiz ishlarni bartaraf etadigan, qadamlarni optimal tarzda ketma-ketlashtiradigan va qo'shilish turlarini tanlaydigan so'rovlar optimallashtiruvchisiga ega bo'lish sizni buzishi mumkin. MongoDB yordamida siz qulaylik evaziga ko'proq nazoratga ega bo'lasiz.

kabi vositalar Studio 3T da yig'ish so'rovlarini qurishni soddalashtiradi MongoDB. Aggregatsiya muharriri xususiyati sizga quvur liniyasi bayonotlarini bir vaqtning o'zida bir bosqichda qo'llash va nosozliklarni tuzatishni soddalashtirish uchun har bir bosqichda kirish va chiqish ma'lumotlarini tekshirish imkonini beradi.

Tez yozishdan foydalanish

Hech qachon MongoDB yozish opsiyalarini yuqori tezlikda, lekin ishonchliligi past qilib belgilamang. Ushbu rejim "fayl va unut" tez ko'rinadi, chunki buyruq yozishdan oldin qaytariladi. Agar ma'lumotlar diskka yozilgunga qadar tizim ishlamay qolsa, u yo'qoladi va mos kelmaydigan holatga tushadi. Yaxshiyamki, 64-bitli MongoDB logging yoqilgan.

MMAPv1 va WiredTiger saqlash dvigatellari buni oldini olish uchun jurnallardan foydalanadi, garchi WiredTiger oxirgi barqarorlikgacha tiklana oladi nazorat nuqtasi, agar jurnalga yozish o'chirilgan bo'lsa.

Jurnallar ma'lumotlar bazasi qayta tiklangandan so'ng barqaror holatda bo'lishini ta'minlaydi va jurnalga yozilgunga qadar barcha ma'lumotlarni saqlab qoladi. Yozuvlar chastotasi parametr yordamida sozlanadi commitIntervalMs.

Yozuvlarga ishonch hosil qilish uchun konfiguratsiya faylida jurnalga kirish yoqilganligiga ishonch hosil qiling (storage.journal.enabled), va yozuvlar chastotasi siz yo'qotishingiz mumkin bo'lgan ma'lumotlar miqdoriga mos keladi.

Indekssiz saralash

Qidiruv va jamlashda ko'pincha ma'lumotlarni saralash kerak bo'ladi. Umid qilamizki, bu saralanadigan ma'lumotlar miqdorini kamaytirish uchun natijani filtrlashdan so'ng yakuniy bosqichlardan birida amalga oshiriladi. Va hatto bu holda, saralash uchun sizga kerak bo'ladi indeks. Siz bitta yoki aralash indeksdan foydalanishingiz mumkin.

Agar tegishli indeks bo'lmasa, MongoDB usiz ishlaydi. Barcha hujjatlarning umumiy hajmida 32 MB xotira chegarasi mavjud saralash operatsiyalari, va agar MongoDB bu chegaraga yetsa, u xato qiladi yoki qaytadi bo'sh yozuvlar to'plami.

Indeks yordamisiz qidirish

Qidiruv so'rovlari SQL da JOIN operatsiyasiga o'xshash funktsiyani bajaradi. Eng yaxshi ishlashi uchun ularga tashqi kalit sifatida ishlatiladigan kalit qiymati indeksi kerak. Bu aniq emas, chunki foydalanish aks ettirilmaydi explain(). Bunday indekslar yozilgan indeksga qo'shimcha hisoblanadi explain(), bu o'z navbatida quvur operatorlari tomonidan qo'llaniladi $match и $sort, ular quvur liniyasining boshida uchrashganda. Endi indekslar istalgan bosqichni qamrab olishi mumkin yig'ish quvuri.

Ko'p yangilanishlardan foydalanishni rad etish

usul db.collection.update() Siz ko'rsatgan parametrga qarab, mavjud hujjatning bir qismini yoki butun hujjatni to'liq almashtirishgacha o'zgartirish uchun ishlatiladi update. Shunchalik ravshan bo'lmagan narsa shundaki, agar siz parametrni o'rnatmasangiz, u to'plamdagi barcha hujjatlarni qayta ishlamaydi multi so'rov mezonlariga javob beradigan barcha hujjatlarni yangilash.

Xesh-jadvaldagi kalitlarning tartibi muhimligini unutmang

JSON-da ob'ekt nol yoki undan ko'p nom/qiymat juftlarining tartibsiz to'plamidan iborat bo'lib, bu erda nom - satr va qiymat - satr, raqam, mantiqiy, null, ob'ekt yoki massiv.

Afsuski, BSON qidiruvda buyurtmaga katta e'tibor beradi. MongoDB-da o'rnatilgan ob'ektlar ichidagi kalitlarning tartibi masalalarya'ni, { firstname: "Phil", surname: "factor" } - bilan bir xil emas { { surname: "factor", firstname: "Phil" }. Ya'ni, agar siz ularni topishga ishonch hosil qilishni istasangiz, hujjatlaringizda nom/qiymat juftliklari tartibini saqlashingiz kerak.

Adashmang "Nul" и "aniqlanmagan"

ma'no "aniqlanmagan" ko'ra, JSONda hech qachon haqiqiy emas edi rasmiy standart JSON (ECMA-404 5-bo'lim), garchi u JavaScript-da ishlatilsa ham. Bundan tashqari, BSON uchun u eskirgan va o'zgartirilgan $null, bu har doim ham yaxshi yechim emas. Foydalanishdan saqlaning "aniqlanmagan" MongoDB da.

foydalanish $limit() holda $sort()

Ko'pincha siz MongoDB-da ishlayotganingizda, so'rov yoki yig'ish orqali qaytariladigan natija namunasini ko'rish foydali bo'ladi. Ushbu vazifa uchun sizga kerak bo'ladi $limit(), lekin bundan oldin foydalanmasangiz, u hech qachon yakuniy kodda bo'lmasligi kerak $sort. Ushbu mexanik zarur, chunki aks holda siz natija tartibini kafolatlay olmaysiz va ma'lumotlarni ishonchli ko'ra olmaysiz. Natijaning yuqori qismida siz saralashga qarab turli xil yozuvlarni olasiz. Ishonchli ishlashi uchun so'rovlar va yig'ishlar deterministik bo'lishi kerak, ya'ni har safar bajarilganda bir xil natijalarni beradi. O'z ichiga olgan kod $limit(), lekin yoq $sort, deterministik bo'lmaydi va keyinchalik kuzatib borish qiyin bo'lgan xatolarga olib kelishi mumkin.

xulosa

MongoDB-dan hafsalasi pir bo'lishning yagona yo'li uni to'g'ridan-to'g'ri boshqa turdagi ma'lumotlar bazasi bilan solishtirish yoki ma'lum bir taxminlar asosida foydalanishga kirishishdir. Bu apelsinni sanchqi bilan solishtirishga o'xshaydi. Ma'lumotlar bazasi tizimlari ma'lum maqsadlarga xizmat qiladi. O'zingiz uchun bu farqlarni tushunish va qadrlash yaxshidir. MongoDB ishlab chiquvchilarini DBMS yo'lidan pastga tushirishga majbur qilgan yo'lda bosim o'tkazish uyat bo'lardi. Men eski muammolarni hal qilishning yangi va qiziqarli usullarini ko'rishni xohlayman, masalan, ma'lumotlar yaxlitligini ta'minlash va muvaffaqiyatsizlikka va zararli hujumlarga chidamli ma'lumotlar tizimlarini yaratish.

MongoDB 4.0 versiyasida ACID tranzaksiyaliligini joriy etishi muhim yaxshilanishlarni innovatsion usulda joriy etishning yaxshi namunasidir. Ko'p hujjatli va ko'p bayonotli operatsiyalar endi atom hisoblanadi. Bundan tashqari, qulflarni olish va tiqilib qolgan tranzaktsiyalarni tugatish uchun zarur bo'lgan vaqtni sozlash, shuningdek, izolyatsiya darajasini o'zgartirish mumkin.

MongoDB bilan ishlashni boshlashdan oldin bilmoqchi bo'lgan 14 ta narsa

Ko'proq o'qish:

Manba: www.habr.com

a Izoh qo'shish