MongoDB

Վիքիպեդիայից՝ ազատ հանրագիտարանից

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

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

Առանձնահատկություններ[խմբագրել | խմբագրել կոդը]

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

  • Հետևողական 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[3]) ինդեքսներ։ Ներդրված դաշտերը (ինչպես վերը բացատրված է "Ad Hoc հարցումներ" բաժնում) նույնպես կարող են ինդեքսավորվել, և զանգված տիպի ինդեքսավորումը կբերի դրա յուրաքանչյուր էլեմենտի ինդեքսավորման։

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

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

Ագրեգացիա[խմբագրել | խմբագրել կոդը]

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

Ֆայլային պահոց[խմբագրել | խմբագրել կոդը]

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

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[8]). Պատած հավաքածուն ստեղծվում է խմբի չափսով և, օպցիոնալ, էլեմենտների քանակով։ Պատած հավաքածուները հավաքածուների միակ տիպն են, որը պահպանում է մուտքագրման կարգը. հատկացված չափսին հասնելուն պես պատած հավաքածուն գործում է ինչպես կրկնվող հերթ (circular queue

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

Տեղադրում (Deployment)[խմբագրել | խմբագրել կոդը]

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

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

Լեզուների օժանդակում[խմբագրել | խմբագրել կոդը]

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

Գոյություն ունեն նաև բազմաթիվ ոչ պաշտոնական սարքավարներ (դրայվերներ)` C#-ի և .NET-ի[18], ColdFusion-ի[27], Delphi-ի[28], Erlang-ի[29][30], Factor-ի[31], Fantom-ի[32], Go-ի[33], JVM լեզուների (Clojure, Groovy[34], Scala, և այլն)[35], Lua-ի[36], node.js-ի[37], HTTP REST[38], Ruby-ի[39], Racket-ի[40], և Smalltalk-ի համար[41]։

Սինխրոնիզացիա[խմբագրել | խմբագրել կոդը]

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[42]), որը շատ նման է BigTable և PNUTS ընդարձակման մոդելին։ Երևակիչը ընտրում է հատվածի բանալի (shard key), որը որոշում է, թե ինչպես են տվյալները ներկայացվելու։ Տվյալները կիսվում են հատվածների (հատվածի բանալիի հիման վրա) և բաժանվում են բազմաթիվ հատվածների մեջ։ (հատվածը մեկ կամ ավել slave-եր ունեցող master է)։

Երևակիչի ծրագիրը պետք է իմանա, որ այն խոսում է հատվածավորված կլաստերի (cluster) հետ՝ որոշակի գործողությունների կատարման ժամանակ։ Օրինակ, "findAndModify" հարցումը պետք է պարունակի հատվածի բանալի, եթե հարցված հավաքածուն հատվածավորված է[43]։ Ծրագիրը հաղորդակցվում է հատուկ երթուղային (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-ի համար.

Օգտագործողի Գրաֆիկական Ինտերֆեյսներ (GUI)[խմբագրել | խմբագրել կոդը]

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

Լիցենզիա և աջակցություն[խմբագրել | խմբագրել կոդը]

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

օգտագործողներ[խմբագրել | խմբագրել կոդը]

Տեսեք նաև[խմբագրել | խմբագրել կոդը]

Հղումներ[խմբագրել | խմբագրել կոդը]

  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. [1]
  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. [2]
  16. C driver
  17. C++ driver
  18. 18,0 18,1 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. [3]
  41. Smalltalk driver
  42. sharding
  43. [4]
  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-10-25։ Վերցված է 2011 թ․ մայիսի 24 
  57. «MongoDB - diasporatest.com»։ 2010-12-23։ Արխիվացված է օրիգինալից 2010-11-24-ին։ Վերցված է 2010 թ․ դեկտեմբերի 23–ին 
  58. «Implementing MongoDB at Shutterfly - Presentation at MongoSF»։ 2010-04-30։ Վերցված է 2010 թ․ հունիսի 28 
  59. «MongoDB at foursquare - Presentation at MongoNYC»։ 2010-05-21։ Արխիվացված է օրիգինալից 2010 թ․ հունիսի 12-ին։ Վերցված է 2010 թ․ հունիսի 28 
  60. «Carbon Calculated - We use MongoDB and so should you»։ 2010-06-16։ Վերցված է 2010 թ․ օգոստոսի 27–ին 
  61. «bit.ly user history, auto-sharded - Presentation at MongoNYC»։ 2010-05-21։ Արխիվացված է օրիգինալից 2010 թ․ հունիսի 11-ին։ Վերցված է 2010 թ․ հունիսի 28 
  62. Maher Jacqueline (2010-05-25)։ «Building a Better Submission Form»։ NYTimes Open Blog։ Վերցված է 2010 թ․ հունիսի 28 
  63. «How Python, TurboGears, and MongoDB are Transforming SourceForge.net»։ PyCon 2010։ 2010-02-20։ Արխիվացված է օրիգինալից 2011 թ․ փետրվարի 11-ին։ Վերցված է 2010 թ․ հունիսի 28 
  64. «How This Web Site Uses MongoDB»։ Business Insider։ 2010-11-06։ Վերցված է 2010 թ․ հունիսի 28 
  65. 65,0 65,1 «MongoDB at Etsy»։ Code as Craft: Etsy Developer Blog։ 2010-05-19։ Արխիվացված է օրիգինալից 2011 թ․ հունիսի 14-ին։ Վերցված է 2010 թ․ հունիսի 28 
  66. «Holy Large Hadron Collider, Batman!»։ The MongoDB NoSQL Database Blog։ 2010-06-03։ Վերցված է 2010 թ․ օգոստոսի 3–ին 
  67. «A minor update for GameVars»։ Playtomic Blog։ 2010-10-07։ Արխիվացված է օրիգինալից 2011 թ․ հուլիսի 15-ին։ Վերցված է 2010 թ․ հոկտեմբերի 7–ին 
  68. «Building Our Own Tracking Engine With MongoDB»։ Thumbtack Blog։ 2011-05-03։ Արխիվացված է օրիգինալից 2011 թ․ մայիսի 9-ին։ Վերցված է 2011 թ․ մայիսի 15 

Գրականության ցանկ[խմբագրել | խմբագրել կոդը]

Արտաքին հղումներ[խմբագրել | խմբագրել կոդը]