در قسمت قبل با محیط Shell آشنا شدید. همان محیطی که در ترمینال ویندوز یا مک با آن کار کردیم و چند کد ساده را نوشتیم. احتمالا از من می پرسید چرا با Shell کار می کنیم؟ اکثر افراد دوست ندارند با محیط خشک و ساده ترمینال ها کار کنند و ترجیح می دهند از رابط های گرافیکی استفاده کنند تا مجبور به کد نویسی نباشند. به طور مثال اکثر توسعه دهنده ها برای ساخت پایگاه داده و جدول در MySQL از رابط گرافیکی PHPMyAdmin استفاده می کنند و کمتر کسی کدهای آن را به صورت دستی می نویسد. بنابراین چرا ما اصرار به استفاده از Shell داریم؟
من به عنوان کسی که آموزش های این دوره را می نویسم، عنوان «دوره آموزشی MongoDB» را برای این سری انتخاب کرده ام بنابراین باید MongoDB را فارغ از وابستگی های مختلف آن (مثل زبان برنامه نویسی) توضیح بدهم تا شما به صورت دقیق و خالص با MongoDB آشنا شوید. من نمی دانم که شما قرار است از زبان PHP استفاده کنید، یا از Python یا از Node.js یا هر زبان backend دیگری که مد نظرتان می باشد بنابراین اگر بخواهم پایگاه داده را در قالب یک زبان تدریس کنم، قطعا دچار مشکل می شویم و عده ای نمی توانند از آموزش ها استفاده کنند.
با این تفاسیر یک سوال جدی پیش می آید: بالاخره چه؟ در نهایت ما پایگاه داده را فرا می گیریم اما باید از زبان برنامه نویسی خودمان برای راه اندازی وب سایت یا هر برنامه دیگری استفاده کنیم. بگذارید این مورد را بررسی کنیم. ابتدا به قسمت drivers از وب سایت MongoDB بروید:
https://docs.mongodb.com/ecosystem/drivers/
با مراجعه به این صفحه، در سمت چپ، انواع زبان های برنامه نویسی را خواهید دید. روی هر کدام از این زبان ها که کلیک کنید، توضیحات و documentation آن نمایش داده خواهد شد. این درایور ها پکیج هایی هستند که برای زبان برنامه نویسی شما نصب می شوند و پُلی میان زبان برنامه نویسی و پایگاه داده خواهند بود. جالب تر اینجاست که در این درایور ها، دقیقا از همان دستوراتی استفاده می کنیم که در Shell استفاده کرده ایم و تفاوت آنچنانی ندارند. تنها تفاوت، تفاوتی جزئی در نوشتار یا نحو (syntax) آن ها است.
بگذارید از Node.js مثالی برایتان بزنم. در قسمت قبل یاد گرفتیم که برای اتصال به یک collection باید از دستور db.collectionName استفاده کنید (به طوری که collectionName برابر اسم collection شما باشد) اما در پایتون باید از دستور زیر استفاده کنید:
const collection = db.collection('yourCollection');
یعنی نام collection را به صورت یک پارامتر به متدی به نام collection پاس می دهید. سپس برای وارد کردن یک ردیف خاص می گوییم:
collection.insertOne([{someData: 1}]);
البته باید این مسائل و نحوه نوشتار را از طریق documentation رسمی در همین وب سایت یاد بگیرید اما این تفاوت جزئی خللی در روند یادگیری یا کدنویسی شما ایجاد نمی کند. همچنین غیر ممکن است که ما تمام این درایور ها را مورد بررسی قرار دهیم و در یک دوره آموزشی از همه آن ها با زبان های مختلف استفاده کنیم.
البته بعد از تمام شدن مباحث مربوط به MongoDB یک برنامه Node.js را با استفاده از MongoDB طراحی خواهیم کرد که با درایور ها نیز آشنا شوید.
حالا یک مثال دیگر از زبان پایتون را بررسی می کنیم. برای استفاده از MongoDB در زبان پایتون باید از درایوری به نام Pymongo استفاده کنید. مثلا اگر من بخواهم به یک پایگاه داده متصل شوم باید از دستور client استفاده کنم:
db = client['test-database']
سپس برای اینکه به یک collection خاص درون این پایگاه داده متصل شوم از یکی از دو روش ممکن استفاده می کنم: یا همان نحو Shell یا از روش موجود در کد بالا:
collection = db.test_collection collection = db['test-collection']
سپس با دستور زیر پست ها را از پایگاه داده می گیرم:
posts = db.posts
و نهایتا یک پست جدید را به collection خود اضافه می کنم و آیدی آن را می گیرم:
post_id = posts.insert_one(mypost).inserted_id
برای PHP جدا از driver خاص، انواع و اقسام کتابخانه ها و extension های مختلف وجود دارد که هر کدام قواعد خاص خود را دارند. شما با مراجعه به documentation رسمی MongoDB می توانید هر کدام را که خواستید استفاده کنید.
فرض کنید می خواهیم به collection ای به نام users دست پیدا کنیم که درون پایگاه داده ای به نام test است:
$collection = (new MongoDB\Client)->test->users;
سپس می خواهیم یک document جدید در این collection ایجاد کنیم:
$insertOneResult = $collection->insertOne([ 'username' => 'admin', 'email' => 'admin@example.com', 'name' => 'Admin User', ]);
همانطور که می بینید باز هم از insertOne استفاده کرده ایم و تفاوت آنچنان عمیق نیست.
به تصویر زیر نگاه کنید:
در این تصویر ساختار کار MongoDB را می بینید. شما برنامه ای را خواهید داشت که یک UI و یک Backend دارد. حالا Backend شما برای اینکه بتواند با سرور MongoDB ارتباط برقرار کند باید درایور خاصی داشته باشد. همانطور که بالاتر بحث کردیم، انواع و اقسام درایور ها برای زبان های برنامه نویسی مختلف وجود دارند. شما با استفاده از این درایور ها، کوئری (درخواست) خود را به سرورِ MongoDB ارسال می کنید (البته ما تا اینجای کار درخواست ها را از Shell به سرور MongoDB ارسال کرده ایم، بنابراین یا از Shell یا از Driver. سپس این سرور درخواست شما را بررسی کرده و آن را به یک لایه میانی به نام Storage Engine (موتور ذخیره سازی) ارسال می کند. در نهایت این موتور ذخیره سازی، دستور را اجرا می کند (مثلا داده های جدیدی را در پایگاه داده ثبت می کند یا اینکه داده ای را از آن دریافت کرده و به شما پس می فرستد و الی آخر). نام موتور ذخیره سازی پیش فرض در MongoDB موتوری به نام WiredTiger است اما می توانید آن را تغییر دهید، گرچه پیشنهاد نمی شود.
حالا به تصویر زیر نگاه کنید:
اگر بخواهیم نگاه نزدیک تری به Storage Engine داشته باشیم باید با نوع ثبت و دریافت داده ها در آن آشنا شویم. در واقع زمانی که سرور MongoDB درخواست شما را به Storage Engine می دهد، storage engine در ابتدا داده ها را روی مموری ذخیره می کند تا داده هایی که بیشتر استفاده می شوند در مموری حاضر باشند. چرا؟ به دلیل اینکه دسترسی به مموری بسیار سریع تر از دسترسی به داده ها روی دیسک و محل ذخیره است. همچنین اگر قرار به write (نوشتن) داده باشد، ابتدا داده ها را در مموری می نویسد و بعدا آن ها را به دیسک منتقل می کند.
این فصل که فصل اولیه و معرفی MongoDB بود تمام شده است. از قسمت بعدی وارد فصل جدید می شویم که در مورد عملیات CRUD است.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.