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[16]
- C++[17]
- C#[18]
- Haskell[19]
- Java[20]
- Javascript[21]
- Perl[22]
- PHP[23]
- Python[24]
- Ruby[25]
- Scala[26]
Գոյություն ունեն նաև բազմաթիվ ոչ պաշտոնական սարքավարներ (դրայվերներ)` 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) [խմբագրել]
Կան մի քանի օգտագործողի գրաֆիկական ինտերֆեյսներ, որոնք ստեղծվել են երևակիչներին օգնելու` վիզուալիզացնել իրենց տվյալները: Հայտնիների շարքում են.
- Fang of Mongo[48] – վեբ-հիմնված օգտագործողի ինտերֆեյս` Django-ի և jQuery-ի հիման վրա
- Futon4Mongo[49] – CouchDB-ի Futon վեբ ինտերֆեյսի կլոն MongoDB-ի համար
- Mongo3[50] – Ruby-հիմնված ինտերֆեյս
- MongoHub[51] – OS X-ի համար գրված ծրագիր` MongoDB-ն կառավարելու համար
- RockMongo[52] – Լիարժեք ֆունկցիոնալով GUI, որը առավել նման է PHPMyAdmin-ին` գրված PHP-ով
- Opricot[53] – բրոուզեր-հիմնված MongoDB-ի տերմինալ` գրված PHP-ով
- PHPMoAdmin[54] – 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 լիցենզիայի տակ:[55] Կոմմերցիոն լիցենզիաները հասանելի են 10gen-ով: 10gen-ը նաև առաջարկում է արտադրանքի հետ կապված աջակցություն, թրեյնինգներ ը մասնագիտական ծառայություններ MongoDB-ի համար:
Նշանավոր օգտագործողներ [խմբագրել]
- Wordnik[56]
- diaspora[57]
- Shutterfly[58]
- foursquare[59]
- Carbon Calculated[60]
- bit.ly[61]
- New York Times[62]
- SourceForge[63]
- Business Insider[64]
- Etsy[65]
- Eventbrite[65]
- LHC[66]
- Playtomic[67]
- Thumbtack[68]
Տեսեք նաև [խմբագրել]
Հղումներ [խմբագրել]
- ↑ MongoDB website
- ↑ MongoDB Blog - March 2010
- ↑ Geospatial indexes
- ↑ MapReduce
- ↑ GridFS
- ↑ NGINX
- ↑ lighttpd
- ↑ capped collections
- ↑ [1]
- ↑ CentOS and Fedora
- ↑ Debian and Ubuntu,
- ↑ Gentoo
- ↑ Arch Linux
- ↑ official website
- ↑ [2]
- ↑ C driver
- ↑ C++ driver
- ↑ 18,0 18,1 C# driver
- ↑ Haskell driver
- ↑ Java driver
- ↑ JavaScript driver
- ↑ Perl driver
- ↑ PHP driver
- ↑ Python driver
- ↑ Ruby driver
- ↑ Casbah, the officially supported Scala Driver for MongoDB
- ↑ ColdFusion driver
- ↑ Delphi
- ↑ Emongo Erlang driver
- ↑ Erlmongo Erlang driver
- ↑ Factor driver
- ↑ Fantom driver
- ↑ gomongo Go driver
- ↑ GMongo
- ↑ JVM language center
- ↑ LuaMongo
- ↑ node.js driver
- ↑ REST interface
- ↑ rmongo
- ↑ [3]
- ↑ Smalltalk driver
- ↑ sharding
- ↑ [4]
- ↑ Munin plugin
- ↑ Ganglia plugin
- ↑ Scout slow-query plugin
- ↑ Cacti plugin
- ↑ Fang of Mongo
- ↑ Futon4Mongo
- ↑ Mongo3
- ↑ MongoHub
- ↑ RockMongo
- ↑ Opricot
- ↑ PHPMoAdmin
- ↑ The AGPL - MongoDB Blog: May 5, 2009
- ↑ «12 Months with MongoDB»։ 2010-10-25։ http://blog.wordnik.com/12-months-with-mongodb։ Վերցված է 2011-05-24։
- ↑ «MongoDB - diasporatest.com»։ 2010-12-23։ http://www.diasporatest.com/index.php/MongoDB։ Վերցված է 2010-12-23։
- ↑ «Implementing MongoDB at Shutterfly - Presentation at MongoSF»։ 2010-04-30։ http://www.10gen.com/event_mongosf_10apr30#shutterfly։ Վերցված է 2010-06-28։
- ↑ «MongoDB at foursquare - Presentation at MongoNYC»։ 2010-05-21։ http://blip.tv/file/3704098։ Վերցված է 2010-06-28։
- ↑ «Carbon Calculated - We use MongoDB and so should you»։ 2010-06-16։ http://blog.carboncalculated.com/we-use-mongodb-and-so-should-you։ Վերցված է 2010-08-27։
- ↑ «bit.ly user history, auto-sharded - Presentation at MongoNYC»։ 2010-05-21։ http://blip.tv/file/3704043։ Վերցված է 2010-06-28։
- ↑ Maher, Jacqueline (2010-05-25). «Building a Better Submission Form». NYTimes Open Blog. http://open.blogs.nytimes.com/2010/05/25/building-a-better-submission-form/։ Վերցված է 2010-06-28.
- ↑ «How Python, TurboGears, and MongoDB are Transforming SourceForge.net»։ PyCon 2010։ 2010-02-20։ http://us.pycon.org/2010/conference/schedule/event/110/։ Վերցված է 2010-06-28։
- ↑ «How This Web Site Uses MongoDB»։ Business Insider։ 2010-11-06։ http://www.businessinsider.com/how-we-use-mongodb-2009-11։ Վերցված է 2010-06-28։
- ↑ 65,0 65,1 «MongoDB at Etsy»։ Code as Craft: Etsy Developer Blog։ 2010-05-19։ http://codeascraft.etsy.com/2010/05/19/mongodb-at-etsy/։ Վերցված է 2010-06-28։ (չաշխատող հղում)
- ↑ «Holy Large Hadron Collider, Batman!»։ The MongoDB NoSQL Database Blog։ 2010-06-03։ http://blog.mongodb.org/post/660037122/holy-large-hadron-collider-batman։ Վերցված է 2010-08-03։
- ↑ «A minor update for GameVars»։ Playtomic Blog։ 2010-10-07։ http://playtomic.com/blog/post/40-a-minor-update-for-gamevars։ Վերցված է 2010-10-07։
- ↑ «Building Our Own Tracking Engine With MongoDB»։ Thumbtack Blog։ 2011-05-03։ http://engineering.thumbtack.com/2011/05/03/building-our-own-tracking-engine-with-mongodb/։ Վերցված է 2011-05-15։
Գրականության ցանկ [խմբագրել]
- Banker, Kyle (March 28, 2011), MongoDB in Action (1st տպ.), Manning, ISBN 9781935182870, http://manning.com/banker/
- Chodorow, Kristina; Dirolf, Michael (September 23, 2010), MongoDB: The Definitive Guide (1st տպ.), O'Reilly Media, ISBN 9781449381561, http://oreilly.com/catalog/9781449381561
- Pirtle, Mitch (March 3, 2011), MongoDB for Web Development (1st տպ.), Addison-Wesley Professional, ISBN 9780321705334, http://www.informit.com/store/product.aspx?isbn=0132489708
- Hawkins, Tim; Plugge, Eelco; Membrey, Peter (September 26, 2010), The Definitive Guide to MongoDB: The NoSQL Database for Cloud and Desktop Computing (1st տպ.), Apress, ISBN 9781430230519, http://apress.com/book/view/1430230517
Արտաքին հղումներ [խմբագրել]
- 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