MongoDB

Чөлөөт нэвтэрхий толь — Википедиагаас
Jump to navigation Jump to search

Гарчиг

MongoDB – Home[засварлах | edit source]

MongoDB Tutorial[засварлах | edit source]

Audience[засварлах | edit source]

Prerequisites[засварлах | edit source]

MongoDB – Overview[засварлах | edit source]

Database[засварлах | edit source]

Collection[засварлах | edit source]

Document[засварлах | edit source]

Sample Document[засварлах | edit source]

MongoDB – Advantages[засварлах | edit source]

Advantages of MongoDB over RDBMS[засварлах | edit source]

Why Use MongoDB?[засварлах | edit source]

Where to Use MongoDB?[засварлах | edit source]

MongoDB – Environment[засварлах | edit source]

Install MongoDB On Windows[засварлах | edit source]

Install MongoDB on Ubuntu[засварлах | edit source]

Start MongoDB[засварлах | edit source]

Stop MongoDB[засварлах | edit source]

Restart MongoDB[засварлах | edit source]

MongoDB Help[засварлах | edit source]

MongoDB Statistics[засварлах | edit source]

MongoDB – Data Modeling[засварлах | edit source]

Some considerations while designing Schema in MongoDB[засварлах | edit source]

Example[засварлах | edit source]

MongoDB – Create Database[засварлах | edit source]

The use Command[засварлах | edit source]

Syntax[засварлах | edit source]

Example[засварлах | edit source]

MongoDB – Drop Database[засварлах | edit source]

The dropDatabase() Method[засварлах | edit source]

Syntax[засварлах | edit source]

Example[засварлах | edit source]

MongoDB – Create Collection[засварлах | edit source]

The createCollection() Method[засварлах | edit source]

Syntax[засварлах | edit source]

Examples[засварлах | edit source]

MongoDB – Drop Collection[засварлах | edit source]

The drop() Method[засварлах | edit source]

Syntax[засварлах | edit source]

Example[засварлах | edit source]

MongoDB – Data Types[засварлах | edit source]

MongoDB – Insert Document[засварлах | edit source]

The insert() Method[засварлах | edit source]

Syntax[засварлах | edit source]

Example[засварлах | edit source]

MongoDB – Query Document[засварлах | edit source]

The find() Method[засварлах | edit source]

Syntax[засварлах | edit source]

The pretty() Method[засварлах | edit source]

Syntax[засварлах | edit source]

Example[засварлах | edit source]

RDBMS Where Clause Equivalents in MongoDB[засварлах | edit source]

AND in MongoDB[засварлах | edit source]

Syntax[засварлах | edit source]

Example[засварлах | edit source]

OR in MongoDB[засварлах | edit source]

Syntax[засварлах | edit source]

Example[засварлах | edit source]

Using AND and OR Together[засварлах | edit source]

Example[засварлах | edit source]

MongoDB – Update Document[засварлах | edit source]

MongoDB Update() Method[засварлах | edit source]

MongoDB -ийн  шинэчлэлт  болон хадгалах  аргууд нь баримтыг цуглуулгадаа шинэчлэхэд хэрэглэгддэг. Өгөгдөл метод  нь  хадгалсан методыг   дамжуулсан баримтыг орлуулах үед одоо байгаа баримтын  утгыг шинэчлэдэг .

MongoDB Update хийх  арга

Шинэчлэлт  метод  одоо  байгаа баримтын  утгыг шинэчилж  байдаг.

Syntax - Өгүүлбэр зүй

Шинэчлэлийн аргын үндсэн синтакс нь дараах байдалтай байна : >db.COLLECTION_NAME.update(SELECTION_CRITERIA, UPDATED_DATA)

Example - Жишээ нь: Миколийн цуглуулга дараах мэдээллийг агуулна.

{ "_id" : ObjectId(5983548781331adf45ec5), "title":"MongoDB Overview"}
{ "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"}
{ "_id" : ObjectId(5983548781331adf45ec7), "title":"Tutorials Point Overview"}

Example - Жишээ нь:  'MongoDB Overview' нэртэй баримт бичгийн 'New MongoDB Tutorial' гэсэн шинэ нэрийг  тавих  болно.

>db.mycol.update({'title':'MongoDB Overview'},{$set:{'title':'New MongoDB Tutorial'}})
 >db.mycol.find()
 { "_id" : ObjectId(5983548781331adf45ec5), "title":"New MongoDB Tutorial"}
 { "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"}
 { "_id" : ObjectId(5983548781331adf45ec7), "title":"Tutorials Point Overview"}
 >

Анхдагчаар MongoDB нь зөвхөн ганц баримтыг шинэчлэх болно. Олон тооны баримт бичгийг шинэчлэхийн тулд та "олон" параметрийг үнэн гэж тогтоох хэрэгтэй.

>db.mycol.update({'title':'MongoDB Overview'},
    {$set:{'title':'New MongoDB Tutorial'}},{multi:true})

MongoDB Save() Method[засварлах | edit source]

MongoDB save хийх арга

Методыг одоо байгаа баримтын оронд  хадгалах аргаар шинэ баримттай хамт орлуулна. MongoDB-ийн хадгалах аргын үндсэн синтаксыг доор үзүүлье. 

Syntax - Өгүүлбэр зүй

>db.COLLECTION_NAME.save({_id:ObjectId(),NEW_DATA})

Example - Жишээ нь : '5983548781331adf45ec7' файлыг орлох болно.

>db.mycol.save(
{
      "_id" : ObjectId(5983548781331adf45ec7), "title":"Tutorials Point New Topic",
         "by":"Tutorials Point"
   }
)
>db.mycol.find()
{ "_id" : ObjectId(5983548781331adf45ec5), "title":"Tutorials Point New Topic",
   "by":"Tutorials Point"}
{ "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"}
{ "_id" : ObjectId(5983548781331adf45ec7), "title":"Tutorials Point Overview"}
>

MongoDB – Delete Document[засварлах | edit source]

The remove() Method[засварлах | edit source]

The remove Method-MongoDB -ийн устгах  арга нь цуглуулгын баримтаас  устгахад ашиглагддаг. Устгах арга нь хоёр параметрийг хүлээн авдаг . Нэг нь хасах шалгуур бөгөөд хоёр дахь нь зөвхөн нэг туг байна .

Устгах шалгуур - Баримт бичгийн дагуу устгах шалгуурыг арилгах болно.

JustOne -Үнэн эсвэл 1 гэж тохируулсан бол зөвхөн нэг документыг устгах .

Syntax - Өгүүлбэр зүй

Remove аргын үндсэн синтакс нь дараах байдалтай байна :

>db.COLLECTION_NAME.remove(DELLETION_CRITTERIA)

Example - Жишээ нь: Миколийн цуглуулга дараах мэдээллийг агуулна .

{ "_id" : ObjectId(5983548781331adf45ec5), "title":"MongoDB Overview"}
{ "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"}
{ "_id" : ObjectId(5983548781331adf45ec7), "title":"Tutorials Point Overview"}

Example - Жишээ нь: 'MongoDB Overview' нэртэй бүх баримтуудыг устгах болно.

>db.mycol.remove({'title':'MongoDB Overview'})

>db.mycol.find()

{ "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"}

{ "_id" : ObjectId(5983548781331adf45ec7), "title":"Tutorials Point Overview"}

>

Remove Only One[засварлах | edit source]

Олон тооны бичлэг байдаг бөгөөд та зөвхөн эхний бичлэгийг устгахыг хүсч байвал, justOne параметрийг устгах  аргаар тавина .

>db.COLLECTION_NAME.remove(DELETION_CRITERIA,1)

Remove All Documents[засварлах | edit source]

Хэрэв та устгах шалгуурыг зааж өгөөгүй бол MongoDB нь цуглуулгын бүх баримтыг устгах болно. Энэ нь SQL-ийн truncate командтай адил юм.

>db.mycol.remove()
>db.mycol.find()
>

MongoDB – Projection[засварлах | edit source]

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

The find() Method[засварлах | edit source]

MongoDB Query Document-д тайлбарласан хоёр дахь нэмэлт параметрийг авахыг хүссэн талбаруудын жагсаалтыг хүлээн авна. MongoDB-д find  методыг ажиллуулахдаа баримт бичгийн бүх талбаруудыг харуулдаг . Үүнийг хязгаарлахын тулд талбарыг 1 эсвэл 0 утгатай талбаруудын жагсаалтыг тохируулах хэрэгтэй . Үүнийг талбарыг нуухад ашигладаг байхад талбарыг харуулахад хэрэглэгдэнэ .

Syntax - Өгүүлбэр зүй

Төсөөлөлтэй хайх  аргын үндсэн синтакс нь дараах байдалтай байна :

>db.COLLECTION_NAME.find({},{KEY:1})

Example - Жишээ нь: Микол цуглуулах нь дараах өгөгдлүүдтэй байна .

{ "_id" : ObjectId(5983548781331adf45ec5), "title":"MongoDB Overview"}
{ "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"}
{ "_id" : ObjectId(5983548781331adf45ec7), "title":"Tutorials Point Overview"}

Example - Жишээ нь: баримтыг шалгаж байхдаа баримтын гарчигийг харуулна .

>db.mycol.find({},{"title":1,_id:0})
{"title":"MongoDB Overview"}
{"title":"NoSQL Overview"}
{"title":"Tutorials Point Overview"}
>

Хэрэв хайх  аргыг гүйцэтгэх явцад _id талбар үргэлж харагддаг бол , хэрэв та энэ талбарыг хүсэхгүй байгаа бол үүнийг 0 гэж тохируулах хэрэгтэй.

MongoDB – Limiting Records.[засварлах | edit source]

The Limit() Method[засварлах | edit source]

MongoDB  дахь бичлэгийг  хязгаарлахын  тулд limit method-г ашиглах хэрэгтэй . Энэ арга нь нэг төрлийн тоон аргументыг хүлээн авдаг бөгөөд энэ нь таны хүссэн баримт бичгийн тоо юм .

Syntax - Өгүүлбэр зүй

Хязгаар аргын үндсэн синтакс нь дараах байдалтай байна:

>db.COLLECTION_NAME.find().limit(NUMBER)

Example - Жишээ нь: Цуглуулга myycol дараахи мэдээллийг агуулсан байна.

{ "_id" : ObjectId(5983548781331adf45ec5), "title":"MongoDB Overview"}
{ "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"}
{ "_id" : ObjectId(5983548781331adf45ec7), "title":"Tutorials Point Overview"}

Example - Жишээ нь: Баримтыг шалгаж байхад зөвхөн хоёр баримт харуулна.

>db.mycol.find({},{"title":1,_id:0}).limit(2)
{"title":"MongoDB Overview"}
{"title":"NoSQL Overview"}
>

Хэрэв  та хязгаар методын тооны утгыг зааж өгөөгүй бол цуглуулгын бүх баримтыг харуулна.

MongoDB Skip() Method[засварлах | edit source]

Хязгааpлах аргыг ашиглахаас гадна нэг аргыг алгасаж бас тоон хэлбэрийн аргументыг хүлээн авдаг бөгөөд баримт бичгийн тоог алгасахад ашигладаг.

Syntax - Өгүүлбэр зүй

Skip методын үндсэн синтакс нь дараах байдалтай байна:

>db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)

Example - Жишээ нь: Зөвхөн хоёр дахь баримт бичиг харуулав.

>db.mycol.find({},{"title":1,_id:0}).limit(1).skip(1)
{"title":"NoSQL Overview"}
>

Анхаар: skip  методын анхдагч утга 0 байна.

MongoDB – Sorting Records[засварлах | edit source]

The sort() Method[засварлах | edit source]

Syntax[засварлах | edit source]

Example[засварлах | edit source]

MongoDB – Indexing[засварлах | edit source]

The ensureIndex() Method[засварлах | edit source]

Syntax[засварлах | edit source]

Example[засварлах | edit source]

MongoDB – Aggregation[засварлах | edit source]

The aggregate() Method[засварлах | edit source]

Syntax[засварлах | edit source]

Example[засварлах | edit source]

Pipeline Concept[засварлах | edit source]

MongoDB – Replication[засварлах | edit source]

Why Replication?[засварлах | edit source]

How Replication Works in MongoDB[засварлах | edit source]

Replica Set Features[засварлах | edit source]

Set Up a Replica Set[засварлах | edit source]

Example[засварлах | edit source]

Add Members to Replica Set[засварлах | edit source]

Syntax[засварлах | edit source]

Example[засварлах | edit source]

MongoDB – Sharding[засварлах | edit source]

Sharding гэдэг нь тоон өгөгдлийг олон тооны машинд хадгалалт(баримтжуулалт) хийдэг үйл явц(процесс) юм, мөн энэ нь MongoDB-н тоон өгөгдлийн өсөлтийн эрэл хэрэгцээг хангах арга юм. Тоон өгөгдлийн хэмжээ өсөхийн хэрээр ганц машин датаг хадгалахад хангалттай хүрэлцээтэй биш бөгөөд ойлгогдохоор(хүлээн зөвшөөрөхүйц) уншиж болон бичиж чадахгүй юм. Sharding нь хэвтээ хэмжээсд үүсэж буй асуудлуудыг шийдвэрлэдэг. Sharding-тэй байвал та тоон өгөгдлийн өсөлт болон уншиж бичих ажиллагааны эрэлт хэрэгцээг хангахын тулд илүү олон машин нэмж болно. Яагаад sharding гэж? - Дахин хуулбарлах, бүх бичвэрүүд master node рүү хуулбарлагддаг -Нууцлалтай холбоотой асуудлууд мөн мастер луу илгээгддэг. - Нэг хуулбар багц нь 12 node-н хязгаарлалттай байдаг. - Идэвхтэй тоон өгөгдлийн багц том байх үед санах (ой мемори) хангалттай том байж чаддаггүй. - Дотоод диск нь хангалттай том биш -Босоо хэмжээс хэт үнэтэй Дараах диаграммуудад 3-н гол бүрдэл байна. • Shards: shard-г тоон өгөгдлийг хадгалахад хэрэглэдэг. Тэдгээр нь өндөр бололцоо чадамж болон тоон өгөгдлийн хүртээмжтэй байдлыг бий болгодог. Боловсруулалтын орчинд shard бүр нь салангид хувилах багц болдог. • Config Servers(тохируулгын серверүүд): Config servers нь кластерийн метадатаг хадгалдаг. Энэ дата нь shard-ууд дахь дата багцийн кластерийн зураглал агуулдаг. Хайлтын чиглүүлэгчид(The query router) нь энэхүү метадатануудыг Боловсруулалтын орчинд кластерүүд нь яг гурван сonfig Servers-с бүрдэнэ. • Хайлтын чиглүүлэгч: Хайлтын чиглүүлэгч нь үндсэндээ mongo тухайлсан хэлбэр, үйлчлүүлэгч(хэрэглэгчтэй) аппликейшнтэй интерфейс ба зохимжит shard руу шууд үйл ажиллагааг чиглүүлдэг. Хайлтын чиглүүлэгч процесс болон чиглэл нь shard-уудад чиглээд эргээд хэрэглэгчдэд үр дүнг харуулдаг. Sharded кластерууд нь нэгээс илүү хайлтын чиглүүлэгчтэй агуулж чадах бөгөөд тэдгээр нь үйлчлүүлэгчийн хүсэлтийг авахаар хуваагддаг. Үйлчлүүлэгч нэг хайлтын чиглүүлэгч рүү хүсэлт илгээнэ. Ерөнхийдөө . Sharded кластерууд нь олон тооны хайлтын чиглүүлэгчтэй байдаг.

MongoDB – Create Backup[засварлах | edit source]

Энэ бүлэгт MongoDB-д нөөцийг хэрхэн үүсгэх талаар үзэх болно. Dump MongoDB data MongoDB-д өгөгдлийн сангийн нөөц үүсгэхийн тулд та mongodump коммандыг ашиглах хэрэгтэй. Энэ комманд аны серверийн бүх өгөгдлийг dump санд оруулна. Танд өгөгдлийнхөө хэмжээг хязгаарлах эсвэл өөрийн алсын серверийн нөөц үүсгэх олон боломжит сонголтууд байдаг.

MongoDB – Deployment[засварлах | edit source]

Та MongoDB байршуулалт хийхээр бэлтгэж байгаа үед таны аппликайшн боловсруулалтад хэр зэрэг оролцоотой байхыг ойлгохыг хичээх хэрэгтэй. Байршуулалтын орчинг удирдахын тулд байнгын, давтагдах арга замыг боловсруулах нь зүйтэй юм, иймээс та боловсруулалтын явцад тохиолдох гэнэтийн саадыг багасгах болно. Хамгийн сайн арга нь тохиргоогоо(суулгасан програм)загварчлах, ачааллах тест хийх, гол хэмжүүрийг хянах бөгөөд эдгээр мэдээллийг тохиргоогоо(суулгасан програм) хянахын тул ашиглана. Аргын гол хэсэг нь оролтын системийн хянах юм. Энэ нь таны боловсруулалтын систем байршуулахаас өмнө хэрхэн hold up болдогийг ойлгоход, мөн багтаамж нэмэх хэрэгтэй хэсгээ шийдэхэд туслана. Санах ой дахь боломжит нэмэлт баяжуулалтын талаар илүү ойлголттой болох хэрэгтэй, жишээ нь программааа эхлэхийн өмнө түгжээ бичихэд туслана. Та өөрийн байршуулалтаа хянахын тулд, MongoDB дараах коммандуудын заримыг нь хэрэглэдэг. Mongostat Энэхүү комманд нь mongod загварын бүх ажиллагааны статусыг шалгадагбөгөөд өгөгдлий сангийн үйл ажилаагааны хариу үйлдлийг буцаан харуулдаг. Энэ үйлдлүүдэд оруулга, асуултууд, шинэчлэлтүүд, устгагдсан зүйлс, мөн курсосууд ордог. Коммандууд нь та хуудасны эвдрэлийг засаж байх үе болон түгжээний хувь хэмжээг мөн харуулдаг. Энэ нь та санах ойг бага түвшинд байлгаж, бичих чадамжийг нэмэх эсвэь зарим нэг гүйцэтгэлийн асуудалтай байна гэсэн үг юм. Коммандыг ажиллуулахын тулд mongod загварыг эхлүүлэх хэрэгтэй. Өөр нэг коммандын мөрөнд, өөрийн mongodb суулгацын bin директорт очиж mongostat гэж бичнэ. Mongotop Энэ команд нь MongoDB-ийн загвар дээр унших, бичих үйл ажиллагааг илрүүлж харуулдаг. Анхны утгаараа mongotpo нь секунд бүрд мэдээллийг буцаан харуулдаг бөгөөд үүнийг та өөрчилж болно. Та энэхүү унших бичих үйл ажиллагаа таы аппликейшны зорилготой нийцэж байгааг шалгах хэрэгтэй,ба та нэг цагт өгөгдлийн сан руу маш олон бичвэр оруулж, дискнээс ихээр уншуулж, эсвэл ажлын багцын хэмжээг нэмэгдүүлэхэд. Коммандын ажиллуулахын тулд mongod загварыг эхлүүлэх хэрэгтэй. Өөр нэг коммандын мөрөнд, өөрийн mongodb суулгацын bin директорт очиж mongotop гэж бичнэ.

MongoDB – Java[засварлах | edit source]

Өөрийн Java программуудад MongoDB ашиглаж эхлэхээсээ өмнө, та MongoDB JDBC драйвер байгаа болон машин дээр Java суурилуулагдсан эсэхийг шалгах хэрэгтэй. Та өөрийн машин дээр Java суулгах Java зааварыг шалгаж болно. Харин одоо MongoDB JDBC драйверийг хэрхэн тохируулахыг авч үзье. Та mongo.jar замаас jar-г татаж авах хэрэгтэй. Хамгийн сүүлийн хувилбарыг татаж авах хэрэгтэй. а mongo.jar -ийг өөрийн classpath-д оруулах хэрэгтэй. Мэдээллийн бааз руу холбогдох. Мэдээллийн санг холбохын тулд мэдээллийн баазын нэрийг зааж өгөх хэрэгтэй. Хэрэв мэдээллийн бааз байхгүй бол MongoDB автоматаар үүсгэдэг. Мэдээллийн санд холбогдох кодын хэсэг дараах байдлаар байна:

MongoDB – PHP[засварлах | edit source]

Advanced MongoDB MongoDB-г PHP-тэй ашиглахын тулд MongoDB PHP драйверийг ашиглах хэрэгтэй. Драйверийг url Download PHP Driver-с татаж авах хэрэгтэй . Хамгийн сүүлийн хувилбарыг татаж авахаа мартуузай. Одоо архивыг задлах болон php_mongo.dll-г өөрийн PHP өргөтгөлийн директор дотор ("ext" анхдагчаар) тавьсны дараа php.ini файлдаа дараах мөрийг нэмээрэй. Өргөтгөл= php_mongo.dll Холболтыг хийх болон мэдээллийн баазыг сонгох. Холболт хийхийн тулд мэдээллийн баазын нэрийг зааж өгөх хэрэгтэй. Хэрэв мэдээллийн бааз байхгүй бол MongoDB автоматаар үүсгэдэг.

MongoDB – Relationships[засварлах | edit source]

Харилцан хамаарал нь олон төрлийн документууд хоорондоо хэрхэн логик холбоотой байдгийг дүрсэлдэг. Харилцан хамаарал нь Embedded болон Referenced аргуудаар загварчлагдаж болдог. 1:1, 1:N, N:1 эсвэл N:N ийм ч байж болно.
Хэрэглэгчдийн хаягийг хадгалах тохиолдолд авч үзье. Тэгхээр, нэг хэргэлэгч 1:N харилцааг үүсгэх олон хаягтай байж болно.
Хэрэглэгчийн документийн энгийн бүтэц нь дараах хэлбэртэй байна:
{

  "_id": ObjectId("52ffc33cd85242f436000001"),
  "name": "Tom Hanks",
  "contact": "987654321",
  "dob": "01-01-1991"

}
Хаяглалтын документийн энгийн бүтэц нь дараах хэлбэртэй байна:
{

  "_id”: ObjectId("52ffc4a5d85242602e000000"),
  "building": "22 A, Indiana Apt",
  "pincode": 123456,
  "city": "Los Angeles",
  "state": "California"

}

Modeling Embedded Relationships[засварлах | edit source]

Embedded аргачлалд бид хаягийн документийг хэрэглэгчийн баримт бичиг дотор оруулах болно.
{

  "_id”: ObjectId("52ffc33cd85242f436000001"),
  "contact": "987654321",
  "dob": "01-01-1991",
  "name": "Tom Benzamin",
  "address": [
     {
        "building": "22 A, Indiana Apt",
        "pincode": 123456,
        "city": "Los Angeles",
        "state": "California"
     },
     {
        "building": "170 A, Acropolis Apt",
        "pincode": 456789,
        "city": "Chicago",
        "state": "Illinois"
     }
  ]

}
Энэ аргачлал нь холбогдсон сэргээх болон хадгалахад амархан бүх өгөгдлүүдийг нэг документэд хадгалдаг. Документ нь бүхэлдээ нэг query – гээр сэргээгдэж болно:
>db.users.findOne({"name":"Tom Benzamin"},{"address":1})
Дээрх query - д db болон users нь тус бүрдээ өгөгдлийн сан ба цуглуулга юм.
Сул тал нь: хэрэв оруулсан документийн хэмжээ хэтэрхий их болж байвал энэ нь унших/бичих үйл ажиллагаанд нөлөөлж болно.

Modeling Referenced Relationships[засварлах | edit source]

Энэ нь хэвийн хамаарлыг загварчлах арга юм. Энэ аргачлалд хэрэглэгчийн болон хаягийн документ нь бүгд тус тусдаа хадгалагддаг боловч хэрэглэгчийн документ нь хаягийн документийн id хадгалдаг талбарыг агуулдаг.
{

  "_id”: ObjectId("52ffc33cd85242f436000001"),
  "contact": "987654321",
  "dob": "01-01-1991",
  "name": "Tom Benzamin",
  "address_ids": [
     ObjectId("52ffc4a5d85242602e000000"),
     ObjectId("52ffc4a5d85242602e000001")
  ]

}
Дээр үзүүлснээр, хэрэглэгчийн документ нь харгалзах хаягуудын ObjectIds багтаадаг address_ids гэсэн массив талбарыг агуулж байна. Эдгээр ObjectIds – ийг ашигласнаар, бид документийг хаяглах query болгож хаягийн нарийвчилсан мэдээллүүдийг тэндээс авч болно. Энэ аргачлалд бидэнд 2 query шаардлагатай: нэгт хэрэглэгчийн документээс address_ids талбарыг дуудах, хоёрт эдгээр хаягуудыг хаягийн цуглуулгаас дуудах.
>var result = db.users.findOne({"name":"Tom Benzamin"},{"address_ids":1})
>var addresses = db.address.find({"_id":{"$in":result["address_ids"]}})

MongoDB – Database References[засварлах | edit source]

MongoDB харилцан хамааралд үзсэнээр, MongoDB – д энгийн өгөгдлийн сангийн бүтцтийг хэрэгжүүлэхийн тулд бид Referenced харилцан хамаарлын зарчмыг ашигладаг. Мөн бидний лавлах документийн id – г өөр документэд гараар хадгалдаг Manual References – д хамаардаг. Документ нь өөр өөр цуглуулгаас лавлагаа агуулж байгаа тохиолдолд бид MongoDB DBRefs – ийг ашиглаж болно.

DBRefs vs Manual References[засварлах | edit source]

Жишээ хувилбарын хувьд бид гарын авлагын оронд DBRefs – ийг ашигласнаар хаягийн өөр өөр төрлүүдийг хадгалах өгөгдлийн санг (home, office, mailing гэх мэт.) өөр өөр цуглуулгад (address_home, address_office, address_mailing гэх мэт) авч үзнэ. Хэрэглэгчийн цуглуулгын документ хаягийг зааж байвал энэ нь мөн хаягийн төрөл дээр тулгуурласан ямар цуглуулга байхыг тодорхойлохыг шаардана. Иймэрхүү нөхцөлд документ нь маш олон цуглуулгад хамааралтай байвал бид DBRefs – ийг ашиглах хэрэгтэй.

Using DBRefs[засварлах | edit source]

DBRefs – д гурван талбар байдаг:

  • $ref – лавлах документийн цуглуулгыг тодорхойлдог
  • $id – лавлах документийн _id талбарыг тодорхойлдог
  • $db – энэ нь заавал байх шаардлагагүй туслах талбар бөгөөд лавлах документ дэх өгөгдлийн сангийн нэрийг агуулдаг

Кодын хэсэгт үзүүлсэн шиг DBRef талбар хаягийг агуулсан хэрэглэгчийн документийн жишээ авч үзье.
{

  "_id”: ObjectId("53402597d852426020000002"),
  "address": {
  "$ref": "address_home",
  "$id": ObjectId("534009e4d852427820000002"),
  "$db": "tutorialspoint"},
  "contact": "987654321",
  "dob": "01-01-1991",
  "name": "Tom Benzamin"

}
DBRef хаяглах талбар нь энд лавлах документ хаяглах tutorialspoint дах өгөгдлийн сангийн address_document цуглуулгад байгаа бөгөөд 534009e4d852427820000002 гэсэн id – тай байна.
Дараах код нь DBRef – ийн $id параметрээр тодорхойлогдсон id – тай документ цуглуулгад $ref параметрээр (манай тохиолдолд address_home) тодорхойлогдсон динамик байдлаар харагдана.
>var user = db.users.findOne({"name":"Tom Benzamin"})
>var dbRef = user.address
>db[dbRef.$ref].findOne({"_id":(dbRef.$id)})
Дээрх код дараах address_home цуглуулгын хаягийн документийг буцаана:
{

  "_id" : ObjectId("534009e4d852427820000002"),
  "building" : "22 A, Indiana Apt",
  "pincode" : 123456,
  "city" : "Los Angeles",
  "state" : "California"

}

MongoDB – Covered Queries[засварлах | edit source]

Энэ хэсэгт бид хамгаалалттай query – ийн тухай судална.
Хамгаалалттай query (Covered Query) гэж юу вэ?
Албан ёсны MongoDB баримт бичгийн дагуу хамгаалалттай query нь:

  • Query доторх бүх талбар нь индексийн хэсэг байдаг
  • Query – ийн буцаасан талбар нь ижил индексэд байх

Query дэх одоогийн бүх талбарууд нь индексийн нэг хэсэг учраас MongoDB query – н нөхцлүүдтэй таарч байгаа бөгөөд документийн доторхыг харалгүй ижил индекс ашиглаж үр дүнг буцаадаг. Индексүүд нь шуурхай санах ой дотор байгаа учир индексээс өгөгдлийг дуудах нь документийг задалж өгөгдлийг дуудсантай харьцуулахад илүү хурдан.

Using Covered Queries[засварлах | edit source]

хамгаалалттай query – г шалгахын тулд хэрэглэгчийн цуглуулга дах дараах баримтыг авч үзье:
{

  "_id": ObjectId("53402597d852426020000002"),
  "contact": "987654321",
  "dob": "01-01-1991",
  "gender": "M",
  "name": "Tom Benzamin",
  "user_name": "tombenzamin"

}
Бид эхлээд gender болон user_name гэсэн талбаруудад дараах query – г ашиглан хэрэглэгчийн цуглуулгад нийлмэл индексийг үүсгэх болно:
>db.users.ensureIndex({gender:1,user_name:1})
Одоо энэ индекс нь дараах query – г хамгаална:
>db.users.find({gender:"M"},{user_name:1,_id:0})
Дээрх query – ийн хувьд, MongoDB өгөгдлийн сангийн документуудыг хайхгүй. Үүний оронд индексжүүлсэн өгөгдлөөс хамгийн хурдан шаардлагатай өгөгдлийг дуудна.
Манай индекс нь _id талбарыг агуулдаггүй тул бид MongoDB нь query бүрт _id талбарыг тогтмол буцаадаг шиг query – ийн үр дүнгийн багцаас шууд хассан. Тиймээс дараах query нь дээр үүсгэсэн индекс дотор хамгаалагдахгүй юм.
>db.users.find({gender:"M"},{user_name:1})
Эцэст нь индекс дараах тохиолдолд query – г хамгаалахгүй:

  • Ямар ч индексийн талбар нь массив байвал
  • Ямар ч индексийн талбар нь дэд документ байвал

MongoDB - Analyzing Queries[засварлах | edit source]

Query задлах нь өгөгдлийн сан болон индексжүүлэх загвар хэрхэн үр дүнтэй байгааг үнэлэх хамгийн чухал асуудал юм. Бид байнга ашиглагддаг $explain болон $hint query – нүүдийн талаар судлах болно.

Using $explain[засварлах | edit source]

$explain оператор нь query – г мэдээллээр хангадаг, индекс нь query болон бусад статистикт ашиглагдана. Энэ нь индекс хэрхэн зохион байгуулагдаж байгааг шинжлэхэд хамгийн тохиромжтой юм.
Өмнөх бүлэгт бид аль хэдийн gender болон user_name талбар дах хэрэглэгчийн цуглуулгад дараах query – г ашиглан индекс байгуулсан:
>db.users.ensureIndex({gender:1,user_name:1})

Одоо бид дээрх query – д $explain ашиглана:
>db.users.find({gender:"M"},{user_name:1,_id:0}).explain()

Дээрх explain() query дараах задаргаа хийгдсэн утгыг буцаана:
{

  "cursor" : "BtreeCursor gender_1_user_name_1",
  "isMultiKey" : false,
  "n" : 1,
  "nscannedObjects" : 0,
  "nscanned" : 1,
  "nscannedObjectsAllPlans" : 0,
  "nscannedAllPlans" : 1,
  "scanAndOrder" : false,
  "indexOnly" : true,
  "nYields" : 0,
  "nChunkSkips" : 0,
  "millis" : 0,
  "indexBounds" : {
     "gender" : [
        [
           "M",
           "M"
        ]
     ],
     "user_name" : [
        [
           {
              "$minElement" : 1
           },
           {
              "$maxElement" : 1
           }
        ]
     ]
  }

}
Энэ үр дүнгийн багц дах талбаруудыг харцгаая:

  • indexOnly - true утга нь энэ query индекс ашигласныг нотолно.
  • cursor талбар нь ашигласан курсорын төрлийг заана. BTreeCursor төрөл нь тухайн индекс өмнө нь ашиглагдсан болон ашигласан индекст нэр өгч байгааг илтгэнэ. BasicCursor нь бүтэн хайлт ямар ч индекс ашиглаагүй болохыг илтгэдэг.
  • n нь тохиромжтой документын буцаасан тоог заана.
  • nscannedObjects нь хайлт хийсэн документийн нийт тоог заана.
  • nscanned нь хайлт хийгдсэн документ буюу индексийн тоог заана.

Using $hint[засварлах | edit source]

$hint оператор нь query – г ажиллуулахын тулд заасан индексийг ашиглах зохион байгуулалтанд нөлөөлдөг. Query гүйцэтгэлийг өөр өөр индексээр шалгаж үзэхэд тохиромжтой. Жишээ нь, дараах query gender болон user_name талбарын индексийг тодорхойлно:
>db.users.find({gender:"M"},{user_name:1,_id:0}).hint({gender:1,user_name:1})

Дээрх query – г $explain ашиглан задалбал:
>db.users.find({gender:"M"},{user_name:1,_id:0}).hint({gender:1,user_name:1}).explain()

MongoDB – Advanced Indexing[засварлах | edit source]

Хэрэглэгчийн цуглуулгын дараах баримт бичгийг авч үзье.

{

"address": {
     "city": "Los Angeles",
     "state": "California",
     "pincode": "123"
  },
  "tags": [
     "music",
     "cricket",
     "blogs"
  ],
  "name": "Tom Benzamin"

}

Дээрх документ нь хаягийн дэд баримт бичиг болон хаягийн массивыг агуулдаг.

Идэвхжүүлэлтийн талбарууд

Хэрэглэгчийн хаяг дээр тулгуурлан хэрэглэгчийн баримтыг хайхыг хүсч байна гэж бодъё. Үүний тулд бид цуглуулгын хаяг дахь массив дээр индекс үүсгэх болно.

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

Тэмдэглэх массив дээр индекс үүсгэхийн тулд дараах кодыг ашиглана:

>db.users.ensureIndex({"tags":1})

Индексийг үүсгэсний дараа бид ийм цуглуулгад хаягийн талбарыг хайж болно –

>db.users.find({tags:"cricket"})

Зөв зохистой индексжүүлэлтийг ашиглаж байгаа эсэхийг баталгаажуулахын тулд дараах тайлбарлах тушаалыг ашиглана:

>db.users.find({tags:"cricket"}).explain()

Дээрх команд нь "курсор" -ыг үүсгэсэн: "BtreeCursor tags_1" нь зөв индексжүүлэлтийг ашигласан гэдгийг баталсан.

Баримт бичгийн Документын талбаруудыг индексжүүлэх

Бид хот, муж улсын болон кодын талбар дээр тулгуурлан баримт хайхыг хүсч байгаа гэж үзье. Эдгээр бүх талбарууд нь дэд баримтын хаягийн хэсэг тул бид дэд баримт бичгийн бүх талбаруудад индекс үүсгэх болно.

Дэд документын бүх гурван талбарт индекс үүсгэхийн тулд дараах кодыг ашиглана –>db.users.ensureIndex({"address.city":1,"address.state":1,"address.pincode":1})

Индексийг үүсгэсний дараа бид энэ индексийг ашиглаж байгаа дэд баримтын талбаруудыг хайж болно.

>db.users.find({"address.city":"Los Angeles"})

Хайлтын илэрхийлэл нь заасан индексийг дагах ёстой гэдгийг санаарай. Дээрх индекс нь дараах асуултыг дэмждэг.

>db.users.find({"address.city":"Los Angeles","address.state":"California"})

Энэ нь дараах хайлтыг дэмждэг –

>db.users.find({"address.city":"LosAngeles","address.state":"California","address.pincode":"123"})

MongoDB – Indexing limitations[засварлах | edit source]

Энэ бүлэгт Индексжүүлэх Хязгаарлалтууд болон бусад бүрэлдэхүүн хэсгүүдийн талаар суралцах болно.

Нэмэлт

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

RAM хэрэглээ

Индексийг RAM-д хадгалж байгаа учраас индексийн нийт хэмжээ нь RAM хязгаараас хэтрэх ёсгүй. Хэрэв нийт хэмжээ нь RAM хэмжээг ихэсгэдэг бол зарим индексүүдийг устгаж эхэлнэ.

Хайлтын хязгаарлалтууд

Индексжүүлэлт нь -

  • Нин, $ биш, гэх мэт тогтмол илэрхийлэх эсвэл яллах операторууд
  • Арифметик операторууд $ мод шиг, гэх мэт.
  • $ бүлгийн заалт
Тиймээс таны асуулгад зориулсан индексийг шалгахыг зөвлөж байна.

Индекс гол хязгаарууд

2.6 хувилбараас эхлэн MongoDB индексийн түлхүүр хязгаараас давсан индексийн талбарын утгаас индекс үүсгэхгүй.

Баримт Бичвэрүүд нь илэрхийлэх Key Limit-ээс хэт их оруулах

Энэ баримтын индексжүүлсэн талбайн үнэ цэнэ нь индексийн түлхүүр хязгаараас давсан тохиолдолд MongoDB индексжүүлсэн цуглуулгаар аливаа баримт бичгийг оруулахгүй. Мөн mongorestore болон mongoimport хэрэгслүүдтэй адилхан юм.

Хамгийн их хүрээ

  • Цуглуулга 64-аас илүү индекс байж болохгүй.
  • Индексийн нэрний урт нь 125 тэмдэгтээс илүүгүй байж болно.
  • Нийлмэл индекс хамгийн ихдээ 31 талбайн индекстэй байж болно.

MongoDB – ObjectID[засварлах | edit source]

Бид өмнөх бүх бүлгүүдэд MongoDB Object Id ашиглаж байсан. Энэ бүлэгт ObjectId-ийн бүтцийг ойлгох болно.

Обьект нь 12 байт BSON төрөл бөгөөд дараах бүтэцтэй.

  • Эхний 4 байт нь Unix эрин үеэс хойшхи секундийг илэрхийлж байна.
  • Дараагийн 3 байт нь машины танигч байна.
  • Дараагийн 2 байт нь процесс ID-ээс бүрдэнэ
  • Сүүлийн 3 байт нь санамсаргүй тоон утга юм.
  • MongoDB нь DocumentIds-ийг баримт бичиг бүрийн _id талбарт анхдагч утгыг ашигладаг бөгөөд ямар ч баримт үүсгэх явцад үүсгэгддэг. ObjectId-ийн нарийн хослол нь бүх _id талбаруудыг өвөрмөц болгодог.

Шинэ ObjectId үүсгэх

Шинэ ObjectId үүсгэхийн тулд дараах кодыг ашиглана:

>newObjectId = ObjectId()

Дээрх мэдэгдэл нь доор дурдсантай ижил төстэй id:

ObjectId("5349b4ddd2781d08c09890f3")

MongoDB - г ObjectId - г үүсгэхийн оронд 12 байт id :

>myObjectId = ObjectId("5349b4ddd2781d08c09890f4")

Баримт бичгийн цагийн хязгаарыг үүсгэх

Objectid-ийн id нь анх удаа 4 бит байт цагийг хадгалдаг тул ихэнх тохиолдолд та ямар ч баримт бичиг үүсгэх цагийг хадгалах шаардлагагүй байдаг. Та getTimestamp аргыг ашиглан баримтыг үүсгэх цагийг авч болно.

>ObjectId("5349b4ddd2781d08c09890f4").getTimestamp()

Энэ нь ISO-ийн огнооны форматаар энэхүү баримт бичгийн бүтээлийн цагийг буцаах болно.

ISODate("2014-04-12T21:49:17Z")

ObjectId-г String рүү хөрвүүлэх

Зарим тохиолдолд ObjectId-ийн мөрийн форматад хэрэгтэй байж болно. ObjectId мөрийг string дээр хувиргахын тулд дараах кодыг ашиглана:

>newObjectId.str

Дээрх код нь Guid :

5349b4ddd2781d08c09890f3.

MongoDB – Map Reduce[засварлах | edit source]

MongoDB – Text Search[засварлах | edit source]

MongoDB – Regular Expression[засварлах | edit source]

Working with Rockmongo[засварлах | edit source]

MongoDB-Sorting Records (бичлэгүүдийг эрэмбэлэх, төрөлжүүлэх)[засварлах | edit source]

Энэ хэсэгт MongoDB-д оруулсан бичлэгүүдийг(өгөгдлийг) хэрхэн эрэмбэлэх, төрөлжүүлэх талаар авч үзнэ.

sort() функц:MongoDB-д бичлэгүүдийг эрэмбэлэхийн тулд sort() функцийг ашигладаг.Уг функц нь эрэмбэлэх дүрмийн жагсаалтыг агуулах бичиглэлийг хүлээн авдаг.Эрэмбэлэх дүрэм нь 1, -1 утгуудаар тодорхойлогддог. Хэрэв 1 гэсэн утгыг ашиглавал өсөхөөр, -1 утгыг ашиглавал буурахаар эрэмбэлэгдэнэ.

-Syntax(бичиглэл): sort() функцийн үндсэн бичиглэл дараах хэлбэртэй байна.
>db.COLLECTION_NAME.find().sort({KEY:1})
-Жишээ: myycol цуглуулгын хувьд дараах мэдээллийг агуулсан байна.

  { "_id" : ObjectId(5983548781331adf45ec5), "title":"MongoDB Overview"}
{ "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"}
{ "_id" : ObjectId(5983548781331adf45ec7), "title":"Tutorials Point Overview"}

Доорх жишээнд title талбарын утгуудыг буурахаар эрэмбэлсэн байна.
>db.mycol.find({},{"title":1,_id:0}).sort({"title":-1})

  {"title":"Tutorials Point Overview"}
{"title":"NoSQL Overview"}
{"title":"MongoDB Overview"}

Хэрвээ эрэмбэлэхдээ нөхцлийг тодорхойлоогүй бол, sort() функц нь бичиглэлийг өсөхөөр эрэмбэлдэг болно.

MongoDB-indexing[засварлах | edit source]

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

-ensureIndex() функц: MongoDB-н ensureIndex() функцд хэрэгцээт индекс-ээ өгдөг.

-Syntax(бичиглэл): ensureIndex() функцийн бичиглэл дараах хэлбэртэй байна.

  >db.COLLECTION_NAME.ensureIndex({KEY:1})

Энд KEY-нь таны нэрлэхийг хүссэн талбарын нэр бөгөөд "1" нь өсөх дарааллыг илэрхийлнэ. Буурах дарааллаар индекслэхийг хүсвэл "-1"-г бичиж өгнө.

-Жишээ:
>db.mycol.ensureIndex({"title":1}) >
ensureIndex() функц-ээр олон талбарт индекс үүсгэх боломжтой.
>db.mycol.ensureIndex({"title":1,"description":-1}) >
ensureIndex() нь олон үйлдэл хийх боломжит сонголтууд(заавал байх)-тай. Дараах сонголтууд байна.

Сонголтууд Төрөл Тайлбар
background Boolean background индекс ашигласанаар өгөгдлийн сангийн бусад үйл ажиллагааг зогсоохгүй. "true" утгаар сонголтыг идэвхижүүлнэ. Анхдагч утга нь "false" байна.
unique Boolean unique индекс ашигласан үед тус утгыг нь өөр индекст дахин олгож болдоггүй. "true" ашиглан unique-г идэвхижүүлнэ. Анхдагч утга нь "false" байна.
name String Индексийн нэр. Хэрэв нэрлээгүй үед, MongoDB нь индексжүүлсэн талбар болон ангилалаар нь нэр үүсгэдэг.
dropDups Boolean Давхардсан байж болох талбарт өөр(unique index) үүсгэнэ. MongoDB-д индексүүд хамгийн эхэнд илэрсэн түлхүүр болон түүний дэд түлхүүрийн бичиглэл бүрийг устгана. "true" ашиглан өөр индекс тодорхойлно. Анхдагч утга нь "false" байна.
sparse Boolean Хэрэв "true" бол индекс нь зөвхөн заасан талбарийн утгыг илэрхийлнэ. Эдгээр индексүүд нь зай бага ашигладаг боловч, зарим тохиолдолд өөр байх нь бий. Анхдагч утга нь "false" байна.
expireAfterSeconds Integer MongoDB нь бичлэгүүдийг санд хэр удаан хадгалагдаж байгааг хянахын тулд TTL-р үнэлнэ.
v Index version Индексийн хувилбарын дугаар. анхдагч индекс хувилбар индексийг үүсгэх үед ажиллаж байгаа MongoDB хувилбараас хамаарна.
weights document Үнэлгээ(weights) 1-ээс 99,999 хүртлэх тоо бөгөөд энэ нь бусад индексжүүлсэн талбарийн үзүүлэлттэй харьцуулан тухайн талбарын ач холбогдлыг илэрхийлнэ.
default_language String Текстийн индексийн хувьд зогсох үгнүүдийн жагсаалт болон үгийн үндсийг тогтоох дүрмийг тодорхойлдог хэл юм. Анхдагч утга нь "english".
language_override String Текстийн индексийн хувьд анхдагч хэлийг дарж тодорхойлох бичиглэл бүхий талбарын нэрийг тогтоох юм. Анхдагч утга "language".


MongoDB-Aggregation (нэгтгэлт/бүрдэл/цуглуулга)[засварлах | edit source]

Aggregation оператор нь өгөгдлийг боловсруулах болон боловсруулсан үр дүнг буцаадаг. Aggregation оператор нь хэд хэдэн баримт бичгийг хамтад нь боловсруулж бүлэглэсэн утга гаргаж, нэг үр дүнг буцаахын тулд бүлэглэсэн өгөгдөлд олон төрлийн үйлдэл хийж чадна. SQL-н count(*) болон group by үйлдэл нь mongodb aggregation-тай ижил утгатай болно. -aggregate() функц: MongoDB нэгтгэлийн хувьд aggregate() фунцкийг ашиглана.

-Syntax(бичиглэл): aggregate() функцийн үндсэн синтакс нь дараах байдалтай байна.

  >db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)

-Жишээ: Цуглуулгад дараах мэдээлэл байна.

  {
  _id: ObjectId(7df78ad8902c)
  title: 'MongoDB Overview', 
  description: 'MongoDB is no sql database',
  by_user: 'tutorials point',
  url: 'www.tutorialspoint.com',
  tags: ['mongodb', 'database', 'NoSQL'],
  likes: 100
  },
  {
  _id: ObjectId(7df78ad8902d)
  title: 'NoSQL Overview', 
  description: 'No sql database is very fast',
  by_user: 'tutorials point',
  url: 'www.tutorialspoint.com',
  tags: ['mongodb', 'database', 'NoSQL'],
  likes: 10
  },
  {
  _id: ObjectId(7df78ad8902e)
  title: 'Neo4j Overview', 
  description: 'Neo4j is no sql database',
  by_user: 'Neo4j',
  url: 'www.neo4j.com',
  tags: ['neo4j', 'database', 'NoSQL'],
  likes: 750
  },

Дээрх цуглуулгаас "by_user" талбарын гишүүн тус бүр нь хичнээн title талбар дахь "tutorial" бичсэнийг харахын тулд доорх aggregate() аргыг ашиглана.
> db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])

  {
  "result" : [
     {
        "_id" : "tutorials point",
        "num_tutorial" : 2
     },
     {
        "_id" : "Neo4j",
        "num_tutorial" : 1
     }
  ],
  "ok" : 1
  }

Дээрх аргыг SQL query болгож бичвэл:

  select by_user, count(*) 
from mycol
group by by_user

хэлбэртэй болно. Дээрх жишээнд by_user талбараар бүлэглэхдээ by_user талбарт илрэх эхний утга дээр дараагийн илрэх утгыг нэмэх зарчмаар үр дүнг гаргажээ. Aggregation-г advanced хэлбэрээр ашиглах боломж бүхий хэрэглүүрүүдийг доорх жагсаалтаар харуулав.

Хэрэглүүрүүд Тайлбар
$sum Цуглуулсан бүх баримтаас тогтоосон утгын нийлбэрийг харуулна.
$avg Цуглуулгын бүх баримтаас авсан бүх утгуудын дунджийг тооцоолно.
$min Цуглуулгын бүх баримтаас авсан бүх утгуудын хамгийн бага утгыг авна.
$max Цуглуулгын бүх баримтаас авсан бүх утгуудын хамгийн их утгыг авна.
$push Цуглуулгын массив хэлбэрийн үр дүнд утга олгоно.
$addToSet Цуглуулгын массив хэлбэрийн үр дүнд утга олгоно. Гэхдээ хуулбар үүсгэлгүйгээр.
$first Эхний баримтыг бүлгийн дагуу үндсэн баримтаас авна. Энэ нь "$sort"-тай хамт үе шаттай хэрэглэвэл илүү зохимжтой.
$last Сүүлийн баримтыг бүлгийн дагуу үндсэн баримтаас авна. Энэ нь "$sort" stage(шатлал)-тай хамт үе шаттай хэрэглэвэл илүү зохимжтой.

-Pipeline зарчим(дамжуулах хоолойн зарчим) Энгийнээр pipeline зарчим гэдэг бол эхний тушаалын гаралтыг дараагийн тушаалын оролт болгох гэсэн үг юм. MongoDB нь aggregation дээр үүнтэй ижил зарчмыг баримталдаг. MongoDB-н aggregation-г pipeline зарчимаар хэрэглэхийн тулд possible stages(боломжит үе шат/шатлал)-тай хамт ажиллуулдаг. Aggregation framework хүрээнд ажилллах дараах possible stages-үүд байдаг.

$project Цуглуулгаас зарим тодорхой талбаруудыг сонгоход ашиглана.
$match Энэ нь шүүлт хийх ба дараагийн stage-үүдэд оноогдох баримт бичгүүдийг утгуудыг багасгаж болдог.
$group Энэ нь жишээн дээр дурдсанчлан бодит нэгтгэлийг хийдэг.
$sort Баримт бичгүүдийг төрөлжүүлнэ.
$skip Өгөгдсөн баримт бичиг бүхий жагсаалтаас урагш алгасах боломжийг олгоно.
$limit Энэ нь тухайн байрлалаас эхлэн өгсөн тоо хүртлэх баримт бичгийн хэмжээг хязгаарладаг.
$unwind - Энэ нь массив ашигласан баримт бичгийг суллах, зай хэмнэх үүднээс ашиглагддаг.

MongoDB-Replication (нөөцлөлт/олшруулалт)[засварлах | edit source]

Replication бол өгөгдлийг олон серверүүдэд синхрончлох процесс юм. Replication нь өгөгдлийн олдоцыг хангахаас гадна өөр өөр өгөгдлийн сангийн серверүүдэд нөөцлөн хадгалснаар өгөгдлийн хүртээмжтэй байдлыг бий болгодог. Ингэснээр серверээс үүдэлтэй өгөгдөл алдагдахаас хамгаалж буй хэрэг юм. Replication нь тоног төхөөрөмжийн болон үйлчилгээний тасалдалаас хамаарсан өгөгдлийн алдагдал үүссэн ч өгөгдлийг сэргээх боломжтой билээ. Replication-г дахин сэргээх, тайлан боловсруулах, нөөцлөх зэрэгт зориулан хийж болох юм.

-MongoDB-д replication хэрхэн ажилладаг вэ?: MongoDB replica set(тогтсон загвар)-г ашиглан replication-г хийдэг. Replica-д бүх бичих үйлдлийг хүлээн авдаг primary node(анхдагч цэг/бааз) байдаг.Нэг багцад байгаа бусад хоёрдогч node-үүд primary node дээр тулгуурладаг.

  * Replica set нь цор ганц primary node-тэй байна. Replica set нь хоёр эсвэл түүнээс олон node-тэй.(ерөнхийдөө хамгийн багадаа 3 node шаардагддаг)
  * Replica set-н нэг node нь primary, бусад нь secondary node-үүд болдог.		
  * Бүх өгөгдлүүд primary-с secondary node-рүү replication хийгддэг.
  * Тухайн үед primary node-д асуудал гарвал primary node сонгох процесс явагдаж шинэ primary node-г сонгодог.
   * Гэмтсэн node нөхөн сэргээгдсэний дараа secondary node болон ажилладаг 

MongoDB replication-н ердийн схем дээрх Client Application(хэрэглэгчийн програм хангамж)нь primary node-тэй харилцан үйлчилж, primary node нь цааш secondary node-рүү өгөгдлийг replicate хийдэг.

Replica set-н онцлогууд

  • N тооны node-үүд байж болно.
  • Тухайн node-үүдээс аль нь primary node болж болдог.
  • write үйлдлүүд бүгд primary node дээр явагддаг.
  • Автомат failover(алдааг илрүүлэгч)-тэй.
  • Автомат recover(нөхөн сэргээлт)-тэй.
  • Primary node-г автоматаар сонгох процесс хэрэгжүүлдэг.

Replica set тохируулах. Доорх тохиолдолд бие даасан MongoDB-г replica set-рүү хөрвүүлэх тухай юм. Дараах алхамуудаар replica set-рүү хөрвүүлнэ.

  • Ажиллаж байгаа MongoDB серверийг унтраах.
  • --replSet сонголтоор MongoDB серверийг эхлүүлэн, доорх --replSet синтаксийн дагуу тохируулна.
  mongod --port "PORT" --dbpath "YOUR_DB_DATA_PATH" –replSet "REPLICA_SET_INSTANCE_NAME"

Жишээ:

  mongod --port 27017 --dbpath "D:\set up\mongodb\data" --replSet rs0
  • mongod instance(mongod загвар бүхий хэрэглэгч)-г эхлүүлэхдээ rs0-нэртэй, 27017 порт дээр эхлүүлж байна.
  • Одоо command prompt(тушаалын цонх) эхэлж, mongod-той холбогдоно.
  • Хэрэглэгч rs.initiate() тушаалыг өгч шинэ replica set эхлүүлнэ.

replica set-н тохиргоог шалгахын тулд rs.conf тушаалыг ажиллуулна. replica set-н статусыг харахыг хүсвэл, rs.status тушаалыг өгч харах боломжтой.
-Replica set-д хэрэглэгч нэмэх. replica set-д хэрэглэгч нэмэхдээ олон тооны төхөөрөмжүүд дээр mongod-г эхлүүлэх хэрэгтэй. Үүний дараагаар хэрэглэгчийг нэмэхийн тулд rs.add() тушаалыг бичиж өгнө.
-Синтакс(бичиглэл). rs.add() тушаалын синтакс дараах хэлбэртэй байна. >rs.add(HOST_NAME:PORT)
-Жишээ: Жишээн дээр үүсгэсэн mongod instance нь mongod1.net нэртэй бөгөөд, 27017 порт дээр ажиллаж байна. Уг гишүүнийг replica set-д нэмэхийн тулд mongo хэрэглэгчийн rs.add() тушаалыг ажиллуулна.

  >rs.add("mongod1.net:27017")
  >

replica set-д mongod instance нэмсэний дараа зөвхөн primary node-р холбогдсон байдаг. Primary node-р ажиллаж байгаа эсэхээ шалгахын тулд mongo хэрэглэгчийн db.isMaster() тушаалыг ажиллуулна.

MongoDB – GridFS[засварлах | edit source]

GridFS бол MongoDB –д байгаа зураг, аудио файлууд, видео файлууд зэрэг том файдуудыг хураах мөн сэргээж байгаа үйлдлийн тодорхойлолт юм. Энэ нь ерөнхийдөө файлуудыг хадгалж нөөцөлдөг нэг төрлийн файлын систем боловч өгөгдлийг MongoDB-гийн цуглуулганд хадгалдгаараа онцлогтой. GridFS нь файлыг хэсэг хэсгүүдэд хуваан өгөгдлүүдийг ялгаатай document-үүдэд хадгалж өгдөг. Аль нэг document-ын их хэмжээ нь л 255К. GridFS нь цаанаасаа fs.files, fs.chunks гэсэн хоёр цуглуулагтай бөгөөд үүндээ File-ын мета-өгөгдөл болон хэсгийг нь нөөцлөдөг. Хэсэг тус бүр unique_id ObjectID гэсэн хэсгүүдээр тодорхойлогддог. F.files нь эцэг document гэж явна. Fs.chunks document-д байгаа files_id талбар нь тухайн хэсгийг эцэг гэдгийг нь холбож өгч байгаа. Үүнийг fs.files цуглуулгын жишээнээс харцгаая

{
"filename": "test.txt",
"chunkSize": NumberInt(261120),
"uploadDate": ISODate("2014-04-13T11:32:33.557Z"),
"md5": "7b762939321e146569b07f72c62cca4f",
"length": NumberInt(646)
}

Энэ document нь файлын нэр, хэсгийн хэмжээ, оруулсан огноо, болон уртыг агуулж байна. Харин одоо үзүүлэх жишээ бол fs.chunks document-ых юм –

{
"files_id": ObjectId("534a75d19f54bfec8a2fe44b"),
"n": NumberInt(0),
"data": "Mongo Binary Data"
}

GridFS-т файл нэмэх

Бид mp3 өргөтгөлтэй файлыг GridFS-ын put буюу байрлуулах коммандаар хадгалж болно. Үүний тулд бид MongoDB-ыг суулгасан хавтас дотор байгаа mongofiles.exe гэсэн хэрэглэгдэхүүнийг ашиглана. Коммандын цонхоо нээж mongofiles.exe-ын замыг тодорхойлон өгч тухайн кодыг талбарт бичнэ –

>mongofiles.exe -d gridfs put song.mp3

Талбарт бичигдсэн gridfs гэдэг бол тухайн файлыг нөөцөлж байгаа өгөгдлийн сангийн нэр юм. Хэрвээ өгөгдлийн сан тодорхойлогдоогүй байвал , MongoDB автоматаар шинэ document-ыг нээж өгнө. Song.mp3 бол харин байрлуулж байгаа файлын нэр юм. Хэрвээ өгөгдлийн санд байгаа файлын document-ыг харахыг хүсвэл , тухайн query-г ашиглана –

>db.fs.files.find()

Энэ коммандыг бичсэнээр дараачийн document-ыг харагдуулна –

{
_id: ObjectId('534a811bf8b4aa4d33fdf94d'),
filename: "song.mp3",
chunkSize: 261120,
uploadDate: new Date(1397391643474), md5: "e4f53379c909f7bed2e9d631e15c1c41",
length: 10401959
}

Бид fs.chunks цуглуулга дотор тодорхойлогдож байгаа бүх нөөцлөгдсөн хэсгийг харж болох бөгөөд үүнийг ашиглахын тулд өмнөх query-гээр олсон document id хэрэгтэй –

>db.fs.chunks.find({files_id:ObjectId('534a811bf8b4aa4d33fdf94d')})

MongoDB – Capped Collections (Хязгаарлагдмал цуглуулга)[засварлах | edit source]

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

Хязгаарлагдмал цуглуулгыг үүсгэх[засварлах | edit source]

Хязгаарлагдмал цуглуулгыг үүсгэхийн тулд бид энгийн createCollection коммандыг ашигладаг. Гэхдээ ард талд нь сонголтыг нь үнэн байлгах ба цуглуулгын дээд хэмжэг byte-аар зааж өгдөг.

>db.createCollection("cappedLogCollection",{capped:true,size:10000})

Цуглуулгын хэмжээнд өөр нэмэлт зүйл байдаг нь , бид max параметрийг ашиглаж цуглуулганд хэдэн document багтахыг хязгаарлан өгч болно. -

>db.createCollection("cappedLogCollection",{capped:true,size:10000,max:1000})

Хэрвээ ямар нэгэн байдлаар та цуглуулгыг хязгаарлагдсан эсэхийг мэдмээр байвал isCapped коммандыг ашиглах боломжтой –

>db.cappedLogCollection.isCapped()

Хэрвээ хязгаарламаар байгаа цуглуулга байгаа бол , тухайн кодны дагуу хөрвүүлж болно –

>db.runCommand({"convertToCapped":"posts",size:10000})

Энэ код нь бидэнд байгаа цуглуулгыг хязгаарлагдмал цуглуулга болгон нийтлэнэ.

Хязгаарлагдмал цуглуулга ба query

Цаанаасаа өгөгдсөнөөр , хязгаарлагдмал цуглуулга дотроос орсон дарааллын дагуу query-г олох боломжтой. Гэхдээ та document-үүдийг урвуугаар нь сэргээхийг хүсвэл , sort коммандыг дараах кодын дагуу ашиглана –

>db.cappedLogCollection.find().sort({$natural:-1})

Хязгаарлагдмал цуглуулганд мэдэхэд илүүдэхгүй хэдэн мэдээллүүд –

- Хязгаарлагдмал цуглуулгаас document-ыг устгаж чадахгүй.

- Хязгаарлагдмал цуглуулгыг тодорхойлох шууд заагч байхгүй. (id талбарт хүртэл)

- Шинэ document-ыг хийж байгаа үед, MongoDB шинэ document-ыг дискэн дээр байрлуулах шаардлагагүй мэт харагдана. Энэ нь шууд шинэ document-ыг цуглуулгын сүүл хэсэгт нэмж байгаа гэсэн үг. Ингэснээр хязгаарлагдмал цуглуулганд хийх үйлдлийг маш хурдан болгодог.

- Тиймэрхүү байдлаар, MongoDB дээр document-ыг уншиж байгаа үед дискэн дээр байгаа дарааллаар шууд буцаадаг. Ингэснээр унших үйлдлийг маш хурдан болгодог.

MongoDB – Auto-Increment Sequence (Автоматаар нэмэгдэх дараалал)[засварлах | edit source]

MongoDB нь хайрцагнаас гадуурх автоматаар нэмэгдэх функцгүй, яг л SQL өгөгдлийн сайнтай адил. Шууд өгөгдсөнөөр, энэ нь ObjectId-д байгаа _id талбарыг үндсэн түлхүүр болгож document-үүдийг ялгахын тулд 12 byte-ыг ашигладаг. Гэсэн хэдий ч, бид магадгүй _id талбарт ObjectID-гаас өөр утгыг автоматаар нэмэгдүүлэхийг хүсэхэд тэнд магадгүй өөр хувилбар оршиж болно. Энэ нь MongoDB-д цаанаасаа өгөгдөх шинж чанар биш болохоор, бид MongoDB-ын documentation санал болгосон тоолуурт цуглуулгыг хэрэглэн программчлалын аргаар энэ функцыг гүйцэтгэх болно.

Тоолуурт Цуглуулгыг ашиглах

Доор бичигдсэн document-ыг анхаараарай. Бид _id талбарт 1,2,3,4-өөс n тоо хүртэл автоматаар нэмэгдэх тоон дараалалыг харна.

{
"_id":1,
"product_name": "Apple iPhone",
"category": "mobiles"
}

Энэнд зориулж дараалалын бүх талбарт сүүлчийн дараалалыг утгыг хэвэнд нь байлгахын тулд тоолуурт цуглуулгыг үүсгэнэ.

>db.createCollection("counters")

Одоо харин бид тухайн document-д түлхүүр байдлаар productid-тай тоолуурт цуглуулгыг нэмж өгнө –

{
"_id":"productid",
"sequence_value": 0
}

Sequence_value талбар нь дараалалд сүүлчийн утгыг хэвэнд байлгана. Дараах кодны дагуу тоолуурт цуглуулганд document-ыг нэмнэ –

>db.counters.insert({_id:"productid",sequence_value:0})

Javascript функц үүсгэх

Одоо бид дараалалын нэрийг оролтоор авч, дараалалд утгыг нэгээр нэмэгдүүлж буцаахдаа нэмэгдсэн дараалалын утгыг гаргах getNextSequenceValue функцыг үүсгэнэ. Бидний нөхцөлд , дараалалын нэр нь productid байна.

>function getNextSequenceValue(sequenceName){
 var sequenceDocument = db.counters.findAndModify({
query:{_id: sequenceName },
update: {$inc:{sequence_value:1}},
new:true
});
return sequenceDocument.sequence_value;
}

Javascript функцыг ашиглах нь

Бид одоо getNextSequenceValue функцээ ашиглан шинэ document үүсгэн буцаагдсан утгыг document-ын _id талбарт дамжуулах болно.

Хоёр энгийн document-д ашиглана –

>db.products.insert({
"_id":getNextSequenceValue("productid"),
"product_name":"Apple iPhone",
"category":"mobiles"
})
 >db.products.insert({
"_id":getNextSequenceValue("productid"),
"product_name":"Samsung S3",
"category":"mobiles"
})

Дээр харсанчлан бид _id талбарт утга өгөхийг getNextSequenceValue функц ашиглалаа. Баталгаажуулахын тулд, document-ыг энэхүү коммандаар олж болно –

>db.products.find()

Query-г ашигласны дараа буцаах document-д _id талбарт автоматаар нэмэгдсэн байна –

{ "_id" : 1, "product_name" : "Apple iPhone", "category" : "mobiles"}
{ "_id" : 2, "product_name" : "Samsung S3", "category" : "mobiles" }