MongoDB

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

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-08-07-ին։ Վերցված է 2011-06-18 
  8. capped collections
  9. [1]
  10. CentOS and Fedora
  11. Debian and Ubuntu,
  12. Gentoo
  13. «Arch Linux»։ Արխիվացված է օրիգինալից 2011-07-28-ին։ Վերցված է 2011-06-18 
  14. «official website»։ Արխիվացված է օրիգինալից 2010-06-17-ին։ Վերցված է 2011-06-18 
  15. [2]
  16. C driver
  17. C++ driver
  18. 18,0 18,1 C# driver Քաղվածելու սխալ՝ Սխալ <ref> թեգ. «csharp» անվանումը սահմանվել է մի քանի անգամ, սակայն տարբեր բովանդակությամբ:
  19. Haskell driver
  20. Java driver
  21. «JavaScript driver»։ Արխիվացված է օրիգինալից 2012-05-11-ին։ Վերցված է 2011-06-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-06-22-ին։ Վերցված է 2011-06-18 
  30. Erlmongo Erlang driver
  31. Factor driver
  32. «Fantom driver»։ Արխիվացված է օրիգինալից 2020-08-03-ին։ Վերցված է 2011-06-18 
  33. gomongo Go driver
  34. GMongo
  35. JVM language center
  36. LuaMongo
  37. «node.js driver»։ Արխիվացված է օրիգինալից 2011-07-22-ին։ Վերցված է 2011-06-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-06-18-ին։ Վերցված է 2011-06-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 թ․ դեկտեմբերի 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-06-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-06-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-02-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-06-14-ին։ Վերցված է 2010 թ․ հունիսի 28  Քաղվածելու սխալ՝ Սխալ <ref> թեգ. «etsy» անվանումը սահմանվել է մի քանի անգամ, սակայն տարբեր բովանդակությամբ:
  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-07-15-ին։ Վերցված է 2010 թ․ հոկտեմբերի 7–ին 
  68. «Building Our Own Tracking Engine With MongoDB»։ Thumbtack Blog։ 2011-05-03։ Արխիվացված է օրիգինալից 2011-05-09-ին։ Վերցված է 2011 թ․ մայիսի 15 

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

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