**MongoDB**-ն (առաջացած "hu*mongo*us" բառից) բաց ելքային կոդով, բարձր արտադրողականությամբ, սխեմաից զուրկ, դոկումենտ-կողմնորոշված տվյալների հենք է՝ գրված C++ լեզվով։ Տվյալների հենքը դոկումենտ-կողմնորոշված է և ըստ այդմ այն ղեկավարում է JSON-անման փաստաթղթեր (դոկումենտներ)։ Շատ ծրագրեր կարող են ներկայացնել տվյալները ավելի բնական ձևով, քանի որ տվյալները կարող են ներդրված լինել բարդ հիերարխիաներում և միաժամանակ լինել հարցվող և ինդեքսավորվող։

MongoDB-ի մշակումը սկսվեց 2007 թվականի հոկտեմբերին 10gen-ի կողմից։ Առաջին հանրային թողարկումը փետրվարի 2009-ին է եղել։

Առանձնահատկություններ
---------------------

Առանձնահատկություններից են

* Հետևողական UTF-8 կոդավորումը։ Ոչ-UTF-8 տվյալները կարող են պահվել, հարցվել կամ ստացվել հատուկ բինար տվյալների տիպով։
* Տարբեր պլատֆորմների հնատավորություն. բինար փաթեթները հասանելի են Windows, Linux, OS X և Solaris օպերացիոն համակարգերի համար։ MongoDB-ն կարող է կոմպիլացվել գրեթե ցանկացած համակարգի համար։
* Տիպային հարստություն. ունի date (ամսաթիվ), regular expressions (ռեգուլյար արտահայտություններ), code (կոդ), binary data (բինար տվյալներ) և այլն (բոլոր BSON տիպերը)
* Կուրսորներ հարցման արդյունքների համար

Այլ առանձնահատկություններ.

### Ad hoc հարցումներ

MongoDB-ում ցանկացած դաշտ կարող է հարցվել ցանկացած ժամանակ։ MongoDB-ն օժանդակում է միջակայքերով հարցումներ, ռեգուլյար արտահայտություններով որոնում և այլ հատուկ տիպի հարցումներ՝ բացարձակ համընկնումով դաշտերին կից։ Հարցումները կարող են նաև ներառել օգտագործողի կողմից հայտարարված JavaScript ֆունկցիաներ (եթե ֆունկցիան վերադարձնում է true՝ դոկումենտը համընկնում է)։

Հարցումները կարող են վերադարձնել դոկումենտների սպեցիֆիկ դաշտեր (ամբողջական դոկումենտի փոխարեն), ինչպես նաև վերադասավորություն, անցումներ և հարցման արդյունքների սահմանափակում (լիմիտավորում)։

### Ներդրված դաշտերի հարցումներ

Հարցումները կարող են հասցվել ներդրված օբյեկտներով և զանգվածներով։ Եթե հետևյալ JSON օբյեկտը մուտքագրվի *users* հավաքածուի մեջ.

```
 {
   "username" : "bob",
   "address" : {
     "street" : "123 Main Street",
     "city" : "Springfield",
     "state" : "NY"
   }
 }
```

Մենք կկարողանանք հարցում անել այս դոկումենտին հետևյալ կերպ և ստանալ բոլոր դոկումենտները, որոնք ունեն "New York" հասցեն.

```
> db.users.find({"address.state" : "NY"})
```

Զանգվածի էլեմենտները նույնպես կարող են հարցված լինել.

```
> db.food.insert({"fruit" : ["peach", "plum", "pear"]})
> db.food.find({"fruit" : "pear"})
```

### Ինդեքսավորում

Այս փաթեթն օժանդակում է երկրորդական ինդեքսներ՝ ներառյալ մեկ բանալիանոց (single-key), խառը (compound), ունիկալ (unique), ոչ-ունիկալ (non-unique) և աշխարհագրատարածական (geospatial) ինդեքսներ։ Ներդրված դաշտերը (ինչպես վերը բացատրված է "Ad Hoc հարցումներ" բաժնում) նույնպես կարող են ինդեքսավորվել, և զանգված տիպի ինդեքսավորումը կբերի դրա յուրաքանչյուր էլեմենտի ինդեքսավորման։

MongoDB-ի հարցումների օպտիմիզատորը (query optimizer) կփորձի բազում տարբեր հարցման պլաններ՝ հարցման կատարման ժամանակահատվածում, և կընտրի դրանցից առավել արագը՝ պարբերաբար վերադիսկրետավորելով։ Երևակիչնեչը կարող են տեսնել, որ ինդեքսը օգտագործվում է 'explain' ֆունկցիաի հետ և ընտրեն այլ ինդեքս 'hint' ֆունկցիայով։

Ինդեքսները կարող են ստեղծվել և ջնջվել ցանկացած ժամանակ։

### Ագրեգացիա

"Ad Hoc" հարցումների հետ համատեղ, տվյալների հենքը օժանդակում է զույգ գործիքներ ագրեգացիայի համար՝ ներառյալ MapReduce-ը և group (խմբավորման) ֆունկցիան, որը նման է SQL-i GROUP BY արտահայտությանը։

### Ֆայլային պահոց

Այս ծրագիրը ներածում է պրոտոկոլ, որը կոչվում է GridFS, որը օգտագործվում է տվյալների հենքից ֆայլեր ստանալու և դրա մեջ պահելու համար։ Այս ֆայլային պահոցի մեխանիզմը օգտագործվել է plugin-ների մեջ NGINX-ի և lighttpd.-ի համար։

### JavaScript-ի կատարումը սերվերի կողմում

JavaScript-ը MongoDB-ի lingua franca-ն է և կարող է օգտագործվել հարցումների, ագրեգացիայի ֆունկցիաների (այնպիսիք, ինչպիսին է MapReduce-ը) մեջ և ուղարկվել տվյալների հենքին՝ կատարվելու համար։

JavaScript-ի օրինակ հարցման մեջ.

```
> db.foo.find({$where : function() { return this.x == this.y; }})
```

Տվյալների հենքին՝ ի կատար ածվելու համար ուղարկված կոդի օրինակ.

```
> db.eval(function(name) { return "Hello, "+name; }, ["Joe"])
```

Վերը նշվածը կվերադարձնի "Hello, Joe":

JavaScript փոփոխականները կարող են նաև պահվել տվյալներւ հենքում և օգտագործվել ցանկացած այլ JavaScript-ի կողմից՝ որպես գլոբալ փոփոխական։ Ցանկացած լեգալ JavaScript-տիպ՝ ներառյալ ֆունկցիաները և օբյեկտները, կարող են պահվել MongoDB-ում այնպես, որ JavaScript-ը կարողանա օգտագործվի "պահված պրոցեդուրաներ" (stored procedures) գրելու համար։

### Պատած հավաքածուներ

MongoDB-ն օժանդակում է ֆիքսված չափսով հավաքածուներ, որոնք կոչվում են "պատած հավաքածուներ" (capped collections). Պատած հավաքածուն ստեղծվում է խմբի չափսով և, օպցիոնալ, էլեմենտների քանակով։ Պատած հավաքածուները հավաքածուների միակ տիպն են, որը պահպանում է մուտքագրման կարգը. հատկացված չափսին հասնելուն պես պատած հավաքածուն գործում է ինչպես կրկնվող հերթ (circular queue)։

Կուրսորի հատուկ տիպ, որը կոչվում է հետևվող կուրսոր (tailable cursor), կարող է օգտագործվել պատած հավաքածուների հետ։ Այս կուրսորը կոչվել է ի պատիվ `tail -f` հրամանի և չի փակվում, երբ այն վերջացնում է վերադարձնել արդյունքները, այլ շարունակում է սպասել ևս մեկի վերադարձմանը, վերադարձնելով նոր արդյունքներ՝ պատած հավաքածուի մեջ դրանց ավելանալուն պես։

Տեղադրում (Deployment)
----------------------

MongoDB-ն կարող է ստեղծվել և տեղադրվել ելքային կոդից (source code), բայց հիմնականում տեղադրվում է բինար փաթեթից։ Բազում Linux-ի փաթեթների կառավարման համակարգերի պահեստներ այժմ ներառում են MongoDB-ի փաթեթը՝ ներառյալ CentOS և Fedora, Debian և Ubuntu, Gentoo և Arch Linux։ Այն նաև կարելի է ներբեռնել պաշտոնական կայքից։

MongoDB-ն օգտագործում է հիշողությանը հատկացված ֆայլեր՝ սահմանափակելով տվյալների չափսը 2GB-ով 32 բիթանոց մեքենաների վրա (64 բիթային համակարգերն ունեն բավականին ավելի մեծ տվյալների չափ). MongoDB սերվերը կարող է օգտագործվել միայն "little-endian" համակարգերի հետ, չնայած դրայվերների մեծամասնությունը գործում է թե little-endian, և թե big-endian համակարգերի վրա։

### Լեզուների օժանդակում

MongoDB-ն ունի պաշտոնական դրայվերներ հետևյալ լեզուների համար.

* C
* C++
* C#
* Haskell
* Java
* Javascript
* Perl
* PHP
* Python
* Ruby
* Scala

Գոյություն ունեն նաև բազմաթիվ ոչ պաշտոնական սարքավարներ (դրայվերներ)` C#-ի և .NET-ի, ColdFusion-ի, Delphi-ի, Erlang-ի, Factor-ի, Fantom-ի, Go-ի, JVM լեզուների (Clojure, Groovy, Scala, և այլն), Lua-ի, node.js-ի, HTTP REST, Ruby-ի, Racket-ի, և Smalltalk-ի համար։

### Սինխրոնիզացիա

MongoDB-ն երբեք ցանկալի չէ, որ տեղադրվի ավելի քիչ, քան 2 սերվերների վրա` master-ի և slave-ի։ Master-ը կարող է կատարել գրելու/կարդալու ֆունկցիաները։ Slave-ը պատճենում է տվյալները master-ից և կարող է միայն օգտագործվել կարդալու կամ backup-ների համար (և ոչ գրելու)։

MongoDB-ն թույլ է տալիս երևակիչներին երաշխավորել, որ գործողությունը սինխրոնիզացվել է ամենաքիչը \_N\_ սերվերների հետ՝ մեկ գործողության ընթացքում։

#### Master-slave

Master-ի վրա գործողությունների կատարմանը պես slave-ը կնույնացնի ցանկացած փոփոխություն տվյալների նկատմամբ։

Օրինակ՝ master/slave զույգի աշխատանքի սկսելը լոկալ կերպով՝

```
$ mkdir -p ~/dbs/master ~/dbs/slave
$ ./mongod—master—port 10000—dbpath ~/dbs/master
$ ./mongod—slave—port 10001—dbpath ~/dbs/slave—source localhost:10000
```

#### Replica sets

Replica set-երը նման են master-slave-ին, բայց դրանք համագործակցում են slave-ի՝ նոր master ընտրելու հնարավորությանը, եթե այս պահին աշխատող master-ը անջատվում է։

### Հատվածավորում (Sharding)

MongoDB-ն ընդարձակվում է հորիզոնտալ ուղղությամբ, օգտագործելով մի համակարգ, որը կոչվում է հատվածավորում (sharding), որը շատ նման է BigTable և PNUTS ընդարձակման մոդելին։ Երևակիչը ընտրում է հատվածի բանալի (shard key), որը որոշում է, թե ինչպես են տվյալները ներկայացվելու։ Տվյալները կիսվում են հատվածների (հատվածի բանալիի հիման վրա) և բաժանվում են բազմաթիվ հատվածների մեջ։ (հատվածը մեկ կամ ավել slave-եր ունեցող master է)։

Երևակիչի ծրագիրը պետք է իմանա, որ այն խոսում է հատվածավորված կլաստերի (cluster) հետ՝ որոշակի գործողությունների կատարման ժամանակ։ Օրինակ, "findAndModify" հարցումը պետք է պարունակի հատվածի բանալի, եթե հարցված հավաքածուն հատվածավորված է։ Ծրագիրը հաղորդակցվում է հատուկ երթուղային (routing) պրոցեսի՝ "mongos"-ի հետ, որը նույնն է, ինչ միայնակ MongoDB սերվերը։ Այս "mongos" պրոցեսը գիտի, թո ինչ տվյալներ կան յուրաքանչյուր հատվածում և ուղորդում է կլիենտի հարցումները՝ համապատասխանաբար։ Բոլոր հարցումները հոսում են այս պրոցեսի միջով. այն ոչ միայն ուղորդում է հարցումները և պատասխանները, այլն նաև կատարում է վերջնական տվյալների անհրաժեշտ միացումները և սորտավորումները։ "Mongos" պրոցեսների ցանկացած քանակ կարող է աշխատել. սովորաբար մեկ ծրագրի համար խորհուրդ է տրվում մեկը։

Կառավարում և գրաֆիկական front-end
---------------------------------

### Պաշտոնական գործիքներ

Ամենաուժեղ և օգտակար կառավարման գործիքը տվյալների հենքի shell-ն է՝ mongo-ն։ Shell-ը թույլ է տալիս երևակիչներին դիտել տվյալները, մուտքագրել դրանք, ջնջել կամ թարմեցնել իրենց տվյալների հենքում, ինչպես նաև ստանալ սինխրոնիզացված ինֆորմացիան, կարգավորել հատվածավորումը, անջատել սերվերները, կատարել JavaScript կոդ և ավելին։ mongo-ն հիմնված է SpiderMonkey-ի վրա և, ըստ այդմ, այն լիարժեք JavaScript shell է, որը թույլ է տալիս միանալ MongoDB սերվերներին։

Ադմինիստրատիվ ինֆորմացիան կարող է հասանելի դառնալ ադմին-ինտերֆեյսի միջոցով՝ հասարակ մի HTML էջի, որը մատակարարում է ինֆորմացիա ներկայիս սերվերի կարգավիճակի մասին։ Լռելյայն, այս ինտերֆեյսը 1000 պորտով ավելի բարձր է տվյալների հենքի պորտից () և կարող է անջատված լինել --norest պարամետրի միջոցով։

mongostat-ը հրամանային տերմինալի գործիք է, որը ցույց է տալիս կարգավիճակի պարզ ցուցակ վերջին վայրկյանի մասին՝ քանի մուտքագրումներ, թարմեցումներ, ջնջումներ, հարցումներ և հրամաններ են կատարվել, ինչպես նաև տվյալների հենքի փակ լինելու (locked) և դրա կողմից օգտագործվող հիշողության քանակի տոկոսային հարաբերությունները։

mongosniff-ը բռնում է (sniff է անում) ցանցի տրաֆիկը, որը գնում և գալիս է դեպի MongoDB:

### Մոնիթորինգ

Կան նաև մոնիթորինգի plugin-ներ MongoDB-ի համար.

* munin
* ganglia
* scout
* cacti

### Օգտագործողի Գրաֆիկական Ինտերֆեյսներ (GUI)

Կան մի քանի օգտագործողի գրաֆիկական ինտերֆեյսներ, որոնք ստեղծվել են երևակիչներին օգնելու՝ վիզուալիզացնել իրենց տվյալները։ Հայտնիների շարքում են.

* Fang of Mongo – վեբ-հիմնված օգտագործողի ինտերֆեյս՝ Django-ի և jQuery-ի հիման վրա
* Futon4Mongo – CouchDB-ի Futon վեբ ինտերֆեյսի կլոն MongoDB-ի համար
* Mongo3 – Ruby-հիմնված ինտերֆեյս
* MongoHub – OS X-ի համար գրված ծրագիր՝ MongoDB-ն կառավարելու համար
* RockMongo – Լիարժեք ֆունկցիոնալով GUI, որը առավել նման է PHPMyAdmin-ին՝ գրված PHP-ով
* Opricot – բրոուզեր-հիմնված MongoDB-ի տերմինալ՝ գրված PHP-ով
* PHPMoAdmin – GUI, որը նման է PHP-ով գրված PHPMyAdmin-ին
* Database Master Modern and Intuitives GUI Tool for Windows
* MongoVUE .NET based GUI for Windows
* Mongo Explorer - MongoDB GUI administration tool based on Silverlight

Լիցենզիա և աջակցություն
-----------------------

MongoDB-ն հասանելի է անվճար տարբերակով՝ GNU Affero General Public License լիցենզիայի տակ։ Լեզուների դրայվերները հասանելի են Apache License լիցենզիայի տակ։ Կոմմերցիոն լիցենզիաները հասանելի են 10gen-ով։ 10gen-ը նաև առաջարկում է արտադրանքի հետ կապված աջակցություն, թրեյնինգներ ը մասնագիտական ծառայություններ MongoDB-ի համար։

օգտագործողներ
-------------

* Wordnik
* diaspora
* Shutterfly
* foursquare
* Carbon Calculated
* bit.ly
* New York Times
* SourceForge
* Business Insider
* Etsy
* Eventbrite
* LHC
* Playtomic
* Thumbtack

Տեսեք նաև
---------

* CouchDB
* NoSQL
* Structured storage

Ծանոթագրություններ
------------------

1. ↑  MongoDB website
2. ↑  MongoDB Blog - March 2010
3. ↑  Geospatial indexes
4. ↑  MapReduce
5. ↑  GridFS
6. ↑  NGINX
7. ↑  «lighttpd». Արխիվացված է օրիգինալից 2011 թ․ օգոստոսի 7-ին. Վերցված է 2011 թ․ հունիսի 18-ին.
8. ↑  capped collections
9. ↑
10. ↑  CentOS and Fedora
11. ↑  Debian and Ubuntu,
12. ↑  Gentoo
13. ↑  «Arch Linux». Արխիվացված է օրիգինալից 2011 թ․ հուլիսի 28-ին. Վերցված է 2011 թ․ հունիսի 18-ին.
14. ↑  «official website». Արխիվացված է օրիգինալից 2010 թ․ հունիսի 17-ին. Վերցված է 2011 թ․ հունիսի 18-ին.
15. ↑
16. ↑  C driver
17. ↑  C++ driver
18. 1 2  C# driver
19. ↑  Haskell driver
20. ↑  Java driver
21. ↑  «JavaScript driver». Արխիվացված է օրիգինալից 2012 թ․ մայիսի 11-ին. Վերցված է 2011 թ․ հունիսի 18-ին.
22. ↑  Perl driver
23. ↑  PHP driver
24. ↑  Python driver
25. ↑  Ruby driver
26. ↑  Casbah, the officially supported Scala Driver for MongoDB
27. ↑  ColdFusion driver
28. ↑  Delphi
29. ↑  «Emongo Erlang driver». Արխիվացված է օրիգինալից 2020 թ․ հունիսի 22-ին. Վերցված է 2011 թ․ հունիսի 18-ին.
30. ↑  Erlmongo Erlang driver
31. ↑  Factor driver
32. ↑  «Fantom driver». Արխիվացված է օրիգինալից 2020 թ․ օգոստոսի 3-ին. Վերցված է 2011 թ․ հունիսի 18-ին.
33. ↑  gomongo Go driver
34. ↑  «GMongo». Արխիվացված է օրիգինալից 2017 թ․ սեպտեմբերի 9-ին. Վերցված է 2011 թ․ հունիսի 18-ին.
35. ↑  JVM language center
36. ↑  LuaMongo
37. ↑  «node.js driver». Արխիվացված է օրիգինալից 2011 թ․ հուլիսի 22-ին. Վերցված է 2011 թ․ հունիսի 18-ին.
38. ↑  REST interface
39. ↑  rmongo
40. ↑
41. ↑  Smalltalk driver
42. ↑  sharding
43. ↑
44. ↑  Munin plugin
45. ↑  Ganglia plugin
46. ↑  Scout slow-query plugin
47. ↑  Cacti plugin
48. ↑  Fang of Mongo
49. ↑  Futon4Mongo
50. ↑  Mongo3
51. ↑  MongoHub
52. ↑  RockMongo
53. ↑  «Opricot». Արխիվացված է օրիգինալից 2011 թ․ հունիսի 18-ին. Վերցված է 2011 թ․ հունիսի 18-ին.
54. ↑  PHPMoAdmin
55. ↑  The AGPL - MongoDB Blog: May 5, 2009
56. ↑  «12 Months with MongoDB». 2010 թ․ հոկտեմբերի 25. Վերցված է 2011 թ․ մայիսի 24-ին.
57. ↑  «MongoDB - diasporatest.com». 2010 թ․ դեկտեմբերի 23. Արխիվացված է օրիգինալից 2010 թ․ նոյեմբերի 24-ին. Վերցված է 2010 թ․ դեկտեմբերի 23–ին-ին.
58. ↑  «Implementing MongoDB at Shutterfly - Presentation at MongoSF». 2010 թ․ ապրիլի 30. Վերցված է 2010 թ․ հունիսի 28-ին.
59. ↑  «MongoDB at foursquare - Presentation at MongoNYC». 2010 թ․ մայիսի 21. Արխիվացված է օրիգինալից 2010 թ․ հունիսի 12-ին. Վերցված է 2010 թ․ հունիսի 28-ին.
60. ↑  «Carbon Calculated - We use MongoDB and so should you». 2010 թ․ հունիսի 16. Վերցված է 2010 թ․ օգոստոսի 27–ին-ին.
61. ↑  «bit.ly user history, auto-sharded - Presentation at MongoNYC». 2010 թ․ մայիսի 21. Արխիվացված է օրիգինալից 2010 թ․ հունիսի 11-ին. Վերցված է 2010 թ․ հունիսի 28-ին.
62. ↑  Maher, Jacqueline (2010 թ․ մայիսի 25). «Building a Better Submission Form». NYTimes Open Blog. Վերցված է 2010 թ․ հունիսի 28-ին.
63. ↑  «How Python, TurboGears, and MongoDB are Transforming SourceForge.net». PyCon 2010. 2010 թ․ փետրվարի 20. Արխիվացված է օրիգինալից 2011 թ․ փետրվարի 11-ին. Վերցված է 2010 թ․ հունիսի 28-ին.
64. ↑  «How This Web Site Uses MongoDB». Business Insider. 2010 թ․ նոյեմբերի 6. Վերցված է 2010 թ․ հունիսի 28-ին.
65. 1 2  «MongoDB at Etsy». Code as Craft: Etsy Developer Blog. 2010 թ․ մայիսի 19. Արխիվացված է օրիգինալից 2011 թ․ հունիսի 14-ին. Վերցված է 2010 թ․ հունիսի 28-ին.
66. ↑  «Holy Large Hadron Collider, Batman!». The MongoDB NoSQL Database Blog. 2010 թ․ հունիսի 3. Վերցված է 2010 թ․ օգոստոսի 3–ին-ին.
67. ↑  «A minor update for GameVars». Playtomic Blog. 2010 թ․ հոկտեմբերի 7. Արխիվացված է օրիգինալից 2011 թ․ հուլիսի 15-ին. Վերցված է 2010 թ․ հոկտեմբերի 7–ին-ին.
68. ↑  «Building Our Own Tracking Engine With MongoDB». Thumbtack Blog. 2011 թ․ մայիսի 3. Արխիվացված է օրիգինալից 2011 թ․ մայիսի 9-ին. Վերցված է 2011 թ․ մայիսի 15-ին.

Գրականության ցանկ
-----------------

* Banker, Kyle (մարտի 28, 2011), *MongoDB in Action* (1st ed.), Manning, էջ 375, ISBN 9781935182870
* Chodorow, Kristina; Dirolf, Michael (սեպտեմբերի 23, 2010), *MongoDB: The Definitive Guide* (1st ed.), O'Reilly Media, էջ 216, ISBN 9781449381561
* Pirtle, Mitch (մարտի 3, 2011), *MongoDB for Web Development* (1st ed.), Addison-Wesley Professional, էջ 360, ISBN 9780321705334
* Hawkins, Tim; Plugge, Eelco; Membrey, Peter (սեպտեմբերի 26, 2010), *The Definitive Guide to MongoDB: The NoSQL Database for Cloud and Desktop Computing* (1st ed.), Apress, էջ 350, ISBN 9781430230519, Արխիվացված է օրիգինալից 2010-12-05-ին, Վերցված է 2011-06-18-ին

Արտաքին հղումներ
----------------

* Official MongoDB Project Website
* mongoDB User Group on LinkedIn
* MongoDB news and articles on myNoSQL
* Eric Lai. (2009, July 1). No to SQL? Anti-database movement gains steam Արխիվացված 2014-07-21 Wayback Machine
* MongoDB articles on NoSQLDatabases.com Արխիվացված 2011-07-14 Wayback Machine
* June 2009 San Francisco NOSQL Meetup Page Արխիվացված 2011-09-05 Wayback Machine
* Designing for the Cloud Արխիվացված 2012-05-05 Wayback Machine at MIT Technology Review
* EuroPython Conference Presentation
* Interview with Mike Dirolf on The Changelog about MongoDB background and design decisions Արխիվացված 2011-07-16 Wayback Machine
* MongoMvc - A MongoDB Demo App with ASP.NET MVC Արխիվացված 2017-12-22 Wayback Machine
* FAQs about MongoDB