MongoDB

MongoDB-ն (առաջացած "humongous" բառից) բաց ելքային կոդով, բարձր արտադրողականությամբ, սխեմաից զուրկ, դոկումենտ-կողմնորոշված տվյալների հենք է՝ գրված 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 պորտով ավելի բարձր է տվյալների հենքի պորտից (http://localhost:28017) և կարող է անջատված լինել --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

Հղումներ

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

Արտաքին հղումներ 
 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
 MongoDB articles on NoSQLDatabases.com 
 June 2009 San Francisco NOSQL Meetup Page 
 Designing for the Cloud  at MIT Technology Review
 EuroPython Conference Presentation
 Interview with Mike Dirolf on The Changelog about MongoDB background and design decisions 
 MongoMvc - A MongoDB Demo App with ASP.NET MVC 
 FAQs about MongoDB

Ծրագրային ապահովում