MongoDB-тэй ажиллахаасаа өмнө мэдэхийг хүсдэг 14 зүйл

Нийтлэлийн орчуулгыг курс эхлэхийн өмнөх өдөр бэлтгэсэн "Харилцаагүй мэдээллийн сан".

MongoDB-тэй ажиллахаасаа өмнө мэдэхийг хүсдэг 14 зүйл

Онцлогууд:

  • Хэдийгээр MongoDB дээр сонголттой ч схем боловсруулах нь маш чухал юм.
  • Үүний нэгэн адил индексүүд нь таны схем болон хандалтын загвартай тохирч байх ёстой.
  • Том объект, том массив ашиглахаас зайлсхий.
  • MongoDB тохиргоонд, ялангуяа аюулгүй байдал, найдвартай байдлын талаар болгоомжтой байгаарай.
  • MongoDB нь асуулга оновчтой болгох төхөөрөмжгүй тул асуулгын үйлдлийг хийхдээ болгоомжтой байх хэрэгтэй.

Би мэдээллийн сантай маш удаан ажиллаж байгаа ч MongoDB-г саяхан олж мэдсэн. Түүнтэй ажиллаж эхлэхээсээ өмнө би хэд хэдэн зүйлийг мэдэж авмаар байна. Тухайн хүн аль хэдийн тодорхой салбарт туршлагатай бол мэдээллийн сан гэж юу болох, юу хийдэг талаар урьдчилж төсөөлдөг. Бусдад ойлгоход хялбар болгох үүднээс би нийтлэг алдаануудын жагсаалтыг толилуулж байна.

Баталгаажуулалтгүйгээр MongoDB сервер үүсгэх

Харамсалтай нь MongoDB нь анхдагчаар баталгаажуулалтгүйгээр суулгагдсан байдаг. Орон нутагт хандах боломжтой ажлын станцын хувьд энэ практик нь хэвийн үзэгдэл юм. Гэхдээ MongoDB нь их хэмжээний санах ой ашиглах дуртай олон хэрэглэгчийн систем учраас зөвхөн хөгжүүлэлтэд ашиглах гэж байгаа ч аль болох их RAM-тай сервер дээр тавивал илүү дээр байх болно. Анхдагч портоор дамжуулан сервер дээр суулгах нь асуудалтай байж болно, ялангуяа хүсэлтэд ямар нэгэн JavaScript кодыг гүйцэтгэх боломжтой бол (жишээлбэл, $where санаа болгон тарилга).

Баталгаажуулах хэд хэдэн арга байдаг ч хамгийн хялбар нь хэрэглэгчийн ID/нууц үг тохируулах явдал юм. Та үндсэн дээр суурилсан гоёмсог баталгаажуулалтын талаар бодож байхдаа энэ санааг ашиглаарай LDAP. Аюулгүй байдлын тухайд MongoDB байнга шинэчлэгдэж байх ёстой бөгөөд бүртгэлийг зөвшөөрөлгүй хандалт хийсэн эсэхийг байнга шалгаж байх ёстой. Жишээлбэл, би өөр портыг анхдагч порт болгон сонгох дуртай.

Довтолгооны гадаргууг MongoDB-тэй холбохоо бүү мартаарай

MongoDB аюулгүй байдлын хяналтын хуудас Сүлжээнд нэвтрэх, мэдээлэл алдагдуулах эрсдэлийг бууруулах сайн зөвлөмжүүдийг агуулсан. Үүнийг арилгахад хялбар бөгөөд хөгжүүлэлтийн сервер нь өндөр түвшний хамгаалалт шаарддаггүй. Гэхдээ энэ нь тийм ч энгийн зүйл биш бөгөөд энэ нь бүх MongoDB серверт хамаатай. Ялангуяа, хэрэглэхэд зайлшгүй шалтгаан байхгүй бол mapReduce, group буюу $хаана, та тохиргооны файлд бичих замаар JavaScript дээр дурын код ашиглахыг идэвхгүй болгох хэрэгтэй javascriptEnabled:false. Стандарт MongoDB-д өгөгдлийн файлууд шифрлэгдээгүй тул MongoDB-тэй ажиллах нь зүйтэй юм Зориулалтын хэрэглэгч, файлд бүрэн хандах эрхтэй, зөвхөн түүнд хандах эрх нь хязгаарлагдмал, үйлдлийн системийн өөрийн файлын хандалтын хяналтыг ашиглах боломжтой.

Хэлхээ боловсруулах явцад гарсан алдаа

MongoDB нь схем ашигладаггүй. Гэхдээ энэ нь схем шаардлагагүй гэсэн үг биш юм. Хэрэв та баримт бичгийг ямар ч тогтмол хэв маяггүйгээр хадгалахыг хүсвэл тэдгээрийг хадгалах нь хурдан бөгөөд хялбар байж болох ч дараа нь сэргээхэд хэцүү байж болно. хараал идсэн хэцүү.

Сонгодог нийтлэл "MongoDB схем дизайны 6 дүрэм" Үүнийг уншихад илүүдэхгүй, мөн онцлогтой Схем судлаач Гуравдагч этгээдийн Studio 3T хэрэгсэлд хэлхээг тогтмол шалгахад ашиглах нь зүйтэй.

Эрэмбэлэх дарааллыг бүү мартаарай

Эрэмбэлэх дарааллыг мартах нь бусад буруу тохиргооноос илүү их бухимдал үүсгэж, илүү их цаг үрдэг. Анхдагч байдлаар MongoBD ашигладаг хоёртын төрөл. Гэхдээ энэ нь хэн нэгэнд ашигтай байх магадлал багатай юм. Өнгөрсөн зууны 80-аад оны үед том жижиг үсгийн, өргөлт мэдрэгчтэй, хоёртын төрлүүд нь бөмбөлгүүдийг, кафтан, буржгар сахалтай хамт сониуч анахронизм гэж тооцогддог байв. Одоо тэдний хэрэглээг уучлах аргагүй болсон. Бодит амьдрал дээр "мотоцикль" гэдэг нь "Мотоцикл"-той ижил байдаг. Мөн "Британи", "Британи" нь нэг газар юм. Жижиг үсэг нь том үсгийн том үсгийн дүйцэхүйц том үсэг юм. Мөн намайг диакритикийг ангилах ажилд бүү оруулаарай. MongoDB дээр өгөгдлийн сан үүсгэхдээ өргөлтийг мэдэрдэггүй харьцах ба бүртгүүлэх, хэлтэй тохирч байгаа ба системийн хэрэглэгчийн соёл. Энэ нь мөрийн өгөгдлийг хайхад илүү хялбар болгоно.

Том баримт бүхий цуглуулга үүсгэх

MongoDB 16MB хүртэлх том хэмжээний баримт бичгүүдийг цуглуулгад байршуулахдаа баяртай байна GridFS 16 МБ-аас их хэмжээтэй том баримт бичигт зориулагдсан. Гэхдээ том хэмжээний баримт бичгийг тэнд байрлуулах боломжтой учраас тэнд хадгалах нь тийм ч сайн санаа биш юм. Хэрэв та хэдхэн килобайт хэмжээтэй баримт бичгүүдийг өргөн SQL хүснэгтийн мөр мэтээр хадгалвал MongoDB хамгийн сайн ажиллах болно. Том хэмжээний баримт бичиг нь асуудлын эх үүсвэр болно бүтээмж.

Том массив бүхий баримт бичиг үүсгэх

Баримт бичиг нь массив агуулж болно. Массив дахь элементийн тоо дөрвөн оронтой тооноос хол байвал хамгийн сайн арга юм. Хэрэв массив руу элементүүдийг байнга нэмбэл, массив нь түүнийг агуулсан баримт бичгээс илүү томрох болно. хөдөл, энэ нь шаардлагатай болно гэсэн үг юм индексүүдийг шинэчилнэ үү. Том массив бүхий баримт бичгийг дахин индексжүүлэх үед индексүүд ихэвчлэн дарж бичигдэх болно, учир нь бичлэг, индексээ хадгалдаг. Энэхүү дахин индексжүүлэлт нь баримт бичиг оруулах эсвэл устгах үед бас тохиолддог.

MongoDB-д нэг зүйл бий "дүүргэх хүчин зүйл", энэ нь энэ асуудлыг багасгахын тулд бичиг баримтыг нэмэгдүүлэх боломжийг олгодог.
Та массивыг индексжүүлэхгүйгээр хийж чадна гэж бодож магадгүй юм. Харамсалтай нь индексийн дутагдал нь танд өөр асуудал үүсгэж болзошгүй юм. Баримт бичгүүдийг эхнээс нь дуустал сканнердсан тул массивын төгсгөлд байгаа элементүүдийг хайхад удаан хугацаа шаардагдах бөгөөд ийм баримт бичигтэй холбоотой ихэнх үйлдлүүд удаан.

Нэгтгэх үе шатуудын дараалал чухал гэдгийг бүү мартаарай

Асуулт оновчтой болгогчтой өгөгдлийн сангийн системд таны бичсэн асуулга нь таны авахыг хүсч буй зүйлийн тайлбар болохоос хэрхэн авах тухай биш юм. Энэ механизм нь ресторанд захиалга өгөхтэй ижил төстэй байдлаар ажилладаг: ихэвчлэн та зүгээр л таваг захиалж өгдөг бөгөөд тогоочдоо нарийвчилсан зааварчилгаа өгдөггүй.

MongoDB дээр та тогоочдоо зааварчилгаа өгдөг. Жишээлбэл, та өгөгдөл дамжиж байгаа эсэхийг шалгах хэрэгтэй reduce ашиглан дамжуулах хоолойд аль болох эрт $match и $project, ба эрэмбэлэх нь зөвхөн дараа л явагдана reduce, мөн хайлт яг таны хүссэн дарааллаар явагдана. Шаардлагагүй ажлыг арилгадаг, алхмуудыг оновчтой дараалуулдаг, нэгдэх төрлийг сонгодог асуулга оновчтой болгох нь таныг сүйтгэж болзошгүй. MongoDB-ийн тусламжтайгаар та тав тухтай байдлын зардлаар илүү их хяналттай болно.

гэх мэт хэрэгслүүд Studio 3T дахь нэгтгэх асуулга бүтээх ажлыг хялбарчлах болно МонгоБ. Aggregation Editor функц нь танд дамжуулах хоолойн мэдэгдлийг нэг үе шаттайгаар ашиглах, алдаа засахад хялбар болгохын тулд үе шат бүрт оролт, гаралтын өгөгдлийг шалгах боломжийг олгодог.

Түргэн бичлэг ашиглах

MongoDB бичих тохиргоог өндөр хурдтай боловч найдвартай байдал багатай гэж хэзээ ч бүү тохируул. Энэ горим "файл хийгээд март" командыг бичихээс өмнө буцаасан тул хурдан юм шиг санагддаг. Хэрэв өгөгдлийг дискэнд бичихээс өмнө систем гацвал энэ нь алдагдаж, тогтворгүй байдалд орно. Аз болоход 64 битийн MongoDB бүртгэлийг идэвхжүүлсэн байна.

MMAPv1 болон WiredTiger хадгалах системүүд үүнээс урьдчилан сэргийлэхийн тулд бүртгэлийг ашигладаг боловч WiredTiger нь хамгийн сүүлийн тогтвортой байдлыг сэргээх боломжтой. хяналтын цэг, бүртгэлийг идэвхгүй болгосон бол.

Тэмдэглэл нь өгөгдлийн санг сэргээсний дараа тогтвортой байдалд байгаа эсэхийг баталгаажуулж, бүх өгөгдлийг бүртгэлд бичих хүртэл хадгалдаг. Бичлэгийн давтамжийг параметрийг ашиглан тохируулна commitIntervalMs.

Бичлэгүүд байгаа эсэхийг шалгахын тулд тохиргооны файлд бүртгэлийг идэвхжүүлсэн эсэхийг шалгаарай (storage.journal.enabled), бичлэгийн давтамж нь таны алдах боломжтой мэдээллийн хэмжээтэй тохирч байна.

Индексгүйгээр эрэмбэлэх

Хайлт хийх, нэгтгэх үед өгөгдлийг ангилах шаардлагатай байдаг. Үүнийг эрэмбэлэх өгөгдлийн хэмжээг багасгахын тулд үр дүнг шүүсний дараа эцсийн шатуудын аль нэгэнд хийнэ гэж найдаж байна. Энэ тохиолдолд ч гэсэн ангилахын тулд танд хэрэгтэй болно индекс. Та дан эсвэл нийлмэл индекс ашиглаж болно.

Хэрэв тохирох индекс байхгүй бол MongoDB түүнгүйгээр хийх болно. Бүх баримт бичгийн нийт хэмжээ 32 МБ санах ойн хязгаартай ангилах үйлдлүүд, хэрэв MongoDB энэ хязгаарт хүрсэн бол алдаа гаргах эсвэл буцах болно хоосон бичлэгийн багц.

Индекс дэмжлэггүйгээр хайх

Хайлтын асуулга нь SQL дээрх JOIN үйлдэлтэй төстэй функцийг гүйцэтгэдэг. Хамгийн сайн ажиллахын тулд гадаад түлхүүр болгон ашигладаг түлхүүрийн утгын индекс хэрэгтэй. Хэрэглээ нь тусгагдаагүй тул энэ нь тодорхойгүй байна explain(). Ийм индексүүд нь бичигдсэн индексээс гадна байдаг explain(), үүнийг эргээд дамжуулах хоолойн операторууд ашигладаг $match и $sort, тэд дамжуулах хоолойн эхэнд уулзах үед. Одоо индексүүд аль ч үе шатыг хамарч болно нэгтгэх дамжуулах хоолой.

Олон шинэчлэлтийг ашиглахаас татгалзаж байна

арга db.collection.update() Таны зааж өгсөн параметрээс хамааран одоо байгаа баримт бичгийн хэсгийг эсвэл бүхэл бүтэн баримтыг бүрэн солих хүртэл өөрчлөхөд ашигладаг. update. Энэ нь тийм ч тодорхой биш зүйл бол та сонголтоо хийхгүй бол цуглуулгын бүх баримт бичгийг боловсруулахгүй multi хүсэлтийн шалгуурыг хангасан бүх баримт бичгийг шинэчлэх.

Хэш хүснэгт дэх түлхүүрүүдийн дарааллын ач холбогдлыг бүү мартаарай

JSON-д объект нь тэг буюу түүнээс олон нэр/утга хосын эрэмблэгдээгүй цуглуулгаас бүрдэх ба нэр нь мөр, утга нь мөр, тоо, логик, null, объект эсвэл массив юм.

Харамсалтай нь BSON хайлт хийхдээ захиалгад ихээхэн ач холбогдол өгдөг. MongoDB дээр суурилагдсан объект доторх түлхүүрүүдийн дараалал асуудалжишээ нь: { firstname: "Phil", surname: "factor" } - энэ нь ижил биш юм { { surname: "factor", firstname: "Phil" }. Өөрөөр хэлбэл, хэрэв та тэдгээрийг олж мэдэхийг хүсч байвал нэр/утга хосын дарааллыг баримт бичигтээ хадгалах ёстой.

Бүү андуураарай "Хоосон" и "тэмдэглэгдээгүй"

үнэ цэнэ "тэмдэглэгдээгүй" дагуу JSON-д хэзээ ч хүчинтэй байгаагүй албан ёсны стандарт JSON (ECMA-404 Хэсэг 5), хэдийгээр JavaScript-д ашиглагддаг. Түүнээс гадна, BSON-ийн хувьд энэ нь хуучирсан бөгөөд хөрвүүлэгддэг $null, энэ нь үргэлж сайн шийдэл биш юм. Хэрэглэхээс зайлсхий "тэмдэглэгдээгүй" MongoDB дээр.

Ашиглах $limit() ямар ч $sort()

Ихэнхдээ та MongoDB-г хөгжүүлж байх үед асуулга эсвэл нэгтгэлээс буцаж ирэх үр дүнгийн жишээг харах нь ашигтай байдаг. Энэ ажилд танд хэрэгтэй болно $limit(), гэхдээ та үүнийг өмнө нь ашиглаагүй бол энэ нь хэзээ ч эцсийн кодонд байх ёсгүй $sort. Энэ механик нь зайлшгүй шаардлагатай, учир нь өөрөөр хэлбэл та үр дүнгийн дарааллыг баталгаажуулж чадахгүй бөгөөд та өгөгдлийг найдвартай харах боломжгүй болно. Үр дүнгийн дээд талд та эрэмбэлэлтээс хамааран өөр өөр оруулгуудыг авах болно. Найдвартай ажиллахын тулд асуулга болон нэгтгэлүүд нь тодорхойлогдсон байх ёстой, өөрөөр хэлбэл тэдгээрийг гүйцэтгэх бүрт ижил үр дүнг гаргах ёстой. агуулсан код $limit(), гэхдээ үгүй $sort, тодорхойлогч биш бөгөөд дараа нь илрүүлэхэд хэцүү алдаа үүсгэж болзошгүй.

дүгнэлт

MongoDB-д сэтгэл дундуур байх цорын ганц арга бол түүнийг DBMS гэх мэт өөр төрлийн мэдээллийн сантай шууд харьцуулах эсвэл тодорхой хүлээлт дээр үндэслэн ашиглах явдал юм. Жүржийг сэрээтэй зүйрлэж байгаа юм шиг. Өгөгдлийн сангийн систем нь тодорхой зорилготой. Эдгээр ялгааг өөрөө ойлгож, үнэлэх нь хамгийн сайн арга юм. MongoDB хөгжүүлэгчдийг DBMS зам руу түлхэх замаар дарамтлах нь ичмээр юм. Өгөгдлийн бүрэн бүтэн байдлыг хангах, бүтэлгүйтэл, хорлонтой халдлагад тэсвэртэй өгөгдлийн системийг бий болгох гэх мэт хуучин асуудлуудыг шийдвэрлэх шинэ, сонирхолтой арга замыг олж харахыг хүсч байна.

MongoDB 4.0 хувилбарт ACID гүйлгээг нэвтрүүлсэн нь чухал сайжруулалтыг шинэлэг байдлаар нэвтрүүлж байгаагийн сайн жишээ юм. Олон баримт бичиг, олон тайлангийн гүйлгээ одоо атомын шинж чанартай болсон. Түгжээ олж авах, гацсан гүйлгээг зогсооход шаардагдах хугацааг тохируулах, тусгаарлах түвшинг өөрчлөх боломжтой.

MongoDB-тэй ажиллахаасаа өмнө мэдэхийг хүсдэг 14 зүйл

Цааш унших:

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх