शुभ संध्या, हब्र। पिछले हफ्ते, 10gen से "MongoDb for Developers" कोर्स, जिसके बारे में उन्होंने
पहले ही हब
पर लिखा था , शुरू हो गया। यदि आप सबक देखते हैं, तो आप सुरक्षित रूप से पास कर सकते हैं। बाकी के लिए, आपका स्वागत है।
यह लेख अध्ययन के पहले सप्ताह की मुख्य सामग्री को रेखांकित करेगा। यदि दर्शक रुचि दिखाते हैं, तो प्रत्येक सप्ताह के अंत में ऐसे पोस्ट प्रकाशित किए जाएंगे।
हम संक्षेप में देखेंगे कि MongoDB क्या है, एक साधारण वेब अनुप्रयोग के लिए मैंगो और संबंधपरक डेटाबेस के बीच डेटा संरचनाओं में अंतर की तुलना करें, शेल के साथ खेलें, और कोड और अजगर का एक सा।
यह लेख क्यों? मैं इसी तरह के सवाल का समर्थन करता हूं। सभी लोग पाठ्यक्रमों में दाखिला लेने में कामयाब नहीं हुए, सभी के पास पर्याप्त खाली समय नहीं है, हर कोई बोली जाने वाली अंग्रेजी की धारणा के साथ अच्छा नहीं कर रहा है। खैर, googling के लिए, ऐसी सामग्री को चोट नहीं पहुंचती है।
MongoDb JSON दस्तावेजों को संग्रहीत करने के लिए एक गैर-संबंधपरक डेटाबेस है। मानगो संग्रह के एक सार उदाहरण पर विचार करें।
{a:3
b:7
fruit:["apple","banana","peach"]}
हम देखते हैं कि इस दस्तावेज़ में पूर्णांक कुंजियाँ a और b हैं और फल कुंजी जो एक सरणी है। रिलेशनल डेटाबेस में, यह व्यवहार असंभव है। यह ध्यान देने योग्य है कि डेटा का ऐसा प्रतिनिधित्व कोड से बहुत करीब है जो हम संबंधित डेटाबेस के साथ काम करते समय करते हैं।
MongoDb में संग्रह एक पूर्वनिर्धारित स्कीमा (स्कीमालेस) से बंधा नहीं है। उदाहरण के लिए, निम्नलिखित दस्तावेज समान संग्रह के तत्व हो सकते हैं।
{a:1,b2}
{a:2,b:4,c:10}
याद रखें कि कितनी बार आपको अपने दांतों को पीसने के लिए ALTER TABLE करने के लिए एक नया फ़ील्ड जोड़ना पड़ा, जो अब तक सभी तत्वों का उपयोग नहीं करेगा? MongoDb के साथ, यह अतीत की बात है।
यदि आप नीचे टेढ़े-मेढ़े छोटे आरेख को देखते हैं, तो आप देख सकते हैं कि डेटा भंडारण की दुनिया में, दो विपरीत ध्रुव हैं। कुंजी-मूल्य भंडारण कार्यक्षमता (जैसे मेम्केड) में खराब, लेकिन अत्यंत कार्यात्मक रिलेशनल डेटाबेस, जो हालांकि, प्रदर्शन और मापनीयता के साथ समस्या है
MongoDb के मूलभूत विचारों में से एक उच्च प्रदर्शन को बनाए रखते हुए कई प्रकार की सुविधाएँ प्रदान करना है। बेशक, आपको कुछ त्याग करना होगा। इसलिए, उदाहरण के लिए, मोंगो में शामिल होने के लिए कोई एनालॉग नहीं है: आप दो अलग-अलग संग्रह के तत्वों को जोड़ नहीं सकते हैं। संबंधपरक डेटाबेस से दूसरा महत्वपूर्ण अंतर लेनदेन की कमी है। उत्तरार्द्ध डरावना लगता है, लेकिन तथ्य यह है कि मानगो में आपको उन परिस्थितियों में लेनदेन की आवश्यकता नहीं होगी, जहां वे रिलेशनल डेटाबेस का उपयोग करते समय आवश्यक होंगे।
शब्दों से कर्मों तकजारी रखने के लिए, हमें MongoDb को स्थापित करना होगा। आपके वितरण के भंडार में आपको नवीनतम संस्करण मिलने की संभावना है, ऐसा न होने की स्थिति में, स्रोत आधिकारिक वेबसाइट पर उपलब्ध है। जीत और मैक के लिए बायनेरिज़ भी हैं। यह ध्यान देने योग्य है कि 32-बिट संस्करण में संग्रहीत डेटा की मात्रा पर महत्वपूर्ण सीमाएं हैं, इसलिए इसका उपयोग केवल विकास के लिए किया जा सकता है। अब हमारे लिए यह महत्वपूर्ण नहीं है।
स्थापित करें, चलाएं और शेल पर जाएं।
dirtyhack@dirtyhack-ThinkPad-Edge-E125:~$ mongo MongoDB shell version: 2.0.4 connecting to: test >
जब तक हमारे पास कोई डेटा नहीं है, तब तक हमारे लिए मूंगो टेस्ट बेस है, जिसके साथ हम काम करेंगे। इसमें हमारा पहला तत्व डालें।
> db.users.save({name:"Woody",age:23}); > db.users.find().pretty() { "_id" : ObjectId("508ea7f33cc5578ed9ecbf46"), "name" : "Woody", "age" : 23 } >
यहां कई दिलचस्प बातें हैं। Db.users.save () कमांड का उपयोग करते हुए, हमने दस्तावेज़ को वर्तमान डेटाबेस के उपयोगकर्ताओं के संग्रह में सहेजने का अनुरोध भेजा है। यह संग्रह पहले मौजूद नहीं था, यह स्वचालित रूप से अनुरोध पर बनाया गया था।
> show collections system.indexes users >
हमने नाम और आयु कुंजियों के साथ, उपयोगकर्ताओं के संग्रह में एक साधारण जस्सन दस्तावेज़ सहेजा है। खोज कमांड का उद्देश्य अनुमान लगाना मुश्किल नहीं है - यह ध्यान देने योग्य है कि मामले में जब हम केवल एक दस्तावेज़ में रुचि रखते हैं, तो यह findOne () कमांड का उपयोग करने के लायक है। सुंदर () कमांड तर्क को प्रभावित नहीं करता है - यह केवल पठनीय रूप में परिणाम प्रदर्शित करता है - इसके बिना, हमें एक स्ट्रिंग मिलेगी, जो जटिल वस्तुओं के साथ काम करते समय सुविधाजनक नहीं है।
यह संग्रह में एक अधिक जटिल तत्व जोड़ने का समय है, और स्पष्ट रूप से मोंगो की सर्किटलेसता को प्रदर्शित करता है।
> db.users.save({name:"Bazz",age:23,place_of_birth: {country:"unknown",region:"unknown"},interests:["flying","fighting with evil"]}); > db.users.find({name:"Bazz"}).pretty() { "_id" : ObjectId("508eab333cc5578ed9ecbf47"), "name" : "Bazz", "age" : 23, "place_of_birth" : { "country" : "unknown", "region" : "unknown" }, "interests" : [ "flying", "fighting with evil" ] } >
हमारे द्वारा जोड़ा गया दूसरा दस्तावेज़ पहले से ही वास्तविक डेटा जैसा है। ध्यान दें कि प्लेस_ऑफ_बर्थ और रुचियों के तत्व क्रमशः नेस्ट डिक्शनरी डॉक्यूमेंट (JSONObject) और सरणी (JSONArray) हैं। पदानुक्रमित घोंसला - सामान्य ज्ञान द्वारा सीमित और प्रति तत्व 16 मेगाबाइट की सीमा।
वैसे, हम अंतर्निहित जावास्क्रिप्ट दुभाषिया का उपयोग कर सकते हैं
> var j=db.users.findOne({name:"Woody"}) > j.age=25 25 > db.users.save(j) > db.users.find({name:"Woody"}).pretty() { "_id" : ObjectId("508ea7f33cc5578ed9ecbf46"), "name" : "Woody", "age" : 25 } >
आप शायद पहले ही देख चुके हैं कि प्रत्येक तत्व को पहचानकर्ता सौंपा गया है। हम इसके बारे में थोड़ी देर बाद बात करेंगे, हम केवल यह ध्यान देते हैं कि यह एक ही संग्रह के भीतर अद्वितीय है।
हम लेख के अंत में एक छोटे से आवेदन में परिणामी संग्रह का उपयोग करते हैं।
डिज़ाइनआइए देखें कि मानगो और एक संबंधपरक डेटाबेस में एक साधारण वेब एप्लिकेशन की डेटा संरचना कैसी दिखेगी।
कल्पना कीजिए कि हमारे पास बुनियादी कार्यक्षमता वाला एक ब्लॉग है। लेखक टैग संलग्न करके पोस्ट प्रकाशित कर सकते हैं, उपयोगकर्ता टैग द्वारा खोज सकते हैं और पोस्ट पर टिप्पणी छोड़ सकते हैं।
रिलेशनल डेटाबेस का उपयोग करते समय, हमें लेखकों, पोस्ट और टिप्पणियों के बारे में डेटा स्टोर करने के लिए तालिकाओं की आवश्यकता होती है। इसके अलावा, हम सबसे अधिक संभावना है कि तालिकाओं के बीच संबंधों को संग्रहीत करने के लिए अतिरिक्त तालिकाओं की आवश्यकता होगी। बेशक, आप अपनी वास्तविकताओं के अनुसार, ब्लॉग आधार को असामान्य कर सकते हैं, लेकिन इसके मूल रूप में, यह कुछ इस तरह दिखेगा।
MongoDb में, समान डेटा स्टोर करने के लिए दो संग्रह पर्याप्त होंगे। मुझे आशा है कि श्री एर्लिकसन की लिखावट, चित्र काफी सुपाठ्य है।
यदि आपने देखा है, तो लेखक का संग्रह एक अद्वितीय _id के रूप में लॉगिन का उपयोग करने का सुझाव देता है। हां, पहचानकर्ता सेट किया जा सकता है (निश्चित रूप से विशिष्टता को देखते हुए), यदि यह सेट नहीं किया गया है, तो सिस्टम इसे आपके लिए करेगा।
जैसा कि आप देख सकते हैं, मोंगो में डेटा संरचना काफी सरल है, और जैसा कि मैंने ऊपर उल्लेख किया है, यह कोड में डेटा के प्रतिनिधित्व के बहुत करीब है।
आप शायद पहले से ही मेरी रूपरेखाओं से थक चुके हैं, इसलिए पहचानकर्ताओं के बारे में एक और टिप्पणी करते हैं, और आखिरकार।
एक पहचानकर्ता स्थापित करना एक उच्च प्राथमिकता वाला ऑपरेशन है। डेटा वास्तव में सहेजे जाने से पहले इसे सेट किया गया है। डिफ़ॉल्ट रूप से, mongo ड्राइवर डेटा को बचाने के बारे में डेटाबेस से प्रतिक्रिया की प्रतीक्षा नहीं करता है, एक पहचानकर्ता प्राप्त करता है और उपयोगकर्ता को एक प्रतिक्रिया देता है। यदि आप इस व्यवहार के साथ सहज नहीं हैं, तो आप सुरक्षित मोड का उपयोग कर सकते हैं, लेकिन कुछ प्रदर्शन हानि के लिए तैयार रहें।
कोड, अपनी माँ लिखें।पहले सप्ताह के पाठों में, अजगर और बोतल के ढांचे में बुनियादी कक्षाओं द्वारा अधिकांश कोड प्रस्तुत किए गए थे। अगले पाठों में, हम अजगर और php में ब्लॉग के पाठ्यक्रम प्रोजेक्ट के साथ काम करेंगे, और अब हम एक सरल एप्लिकेशन बनाएंगे जो कोड से MongoDb के साथ काम करने का प्रदर्शन करता है।
क्रियाओं की प्राथमिक प्रकृति के कारण, हम कोई सार नहीं बनाएंगे और माथे में सब कुछ करेंगे (सहकर्मी शायद सोचेंगे कि मैं बीमार हो गया)। मुझे लगता है कि आप जानते हैं कि कैसे ताओ स्वयं को लिखना है।
हम एक सरल वेब एप्लिकेशन बनाएंगे जो उपयोगकर्ताओं के संग्रह से उपयोगकर्ताओं के नाम और आयु प्रदर्शित करता है और हमें संग्रह में नए तत्वों को जोड़ने की अनुमति देता है।
अजगर के उदाहरण को चलाने के लिए, आपको पाइमोन्गो चालक और बोतल की रूपरेखा की आवश्यकता है। Php पर उदाहरण को चलाने के लिए, आपको एक ड्राइवर की भी आवश्यकता है, आप इसे नाशपाती से ले सकते हैं (एक्सटेंशन की सूची में mongo.so को जोड़ना न भूलें)।
तो उदाहरण हैं
अजगरindex.py import bottle import pymongo import sys
विचार / index.tpl <!DOCTYPE html> <html> <head> <title>Hello world</title> </head> <body> <p> </p><ul> %for user in users: <li>:{{user['name']}} :{{user['age']}}</li> %end </ul> <form action="/submit" method="POST"> <br> <input type="text" name="name" size=40 value=""><br> <input type="text" name="age" size=40 value=""><br> <input type="submit" value="submit"> </form> </body> </html>
पीएचपीपीसीपी पर उदाहरण में एक दुर्लभ व्याख्या है
<? $mongo = new Mongo('localhost'); $database = $mongo -> test; if ($_POST) $database -> users -> insert($_POST); $users = $database -> users -> find(); ?> <!DOCTYPE html> <html> <head> <title>Hello world</title> </head> <body> <?var_dump($users)?> <p> </p><ul> <?foreach($users as $user){?> <li>:<?=$user['name']?> :<?=$user['age']?></li> <?}?> </ul> <form action="/" method="POST"> <br> <input type="text" name="name" size=40 value=""><br> <input type="text" name="age" size=40 value=""><br> <input type="submit" value="submit"> </form> </body> </html>
Php उदाहरणों में रुचि रखने वालों के लिए एक महत्वपूर्ण प्रश्न। भविष्य में, कोड अधिक जटिल होगा, आप Yii या ZF, या एक स्व-लिखित माइक्रोफ़्रामवर्क का उपयोग कर सकते हैं - मैं आपकी इच्छाओं की प्रतीक्षा कर रहा हूं।
यह सब, मुझे आशा है कि मैंने व्यर्थ कोशिश नहीं की। यदि लेख फेरीवालों से अपील करेगा - अगले सप्ताह, मैं दूसरे सप्ताह में एक रिपोर्ट प्रकाशित करूंगा, जिसे सीआरयूडी संचालन माना जाएगा।