در قسمت قبل محیط کاری خود را با نصب MongoDB آماده کردیم و حالا نوبت به ورود عملی و کدنویسی است. همانطور که در جلسه قبل توضیح دادم از این به بعد کاربران مک باید همیشه یک پنجره ترمینال را با دستور mongod
اجرا کنند و آن را نبندند اما کاربران ویندوز می توانند مستقیم وارد command prompt شده و با من کدنویسی کنند. (سرور دیتابیس در ویندوز به صورت یک سرویس اجرا می شود بنابراین نیازی به اجرای دستور mongod
نیست) البته هنوز باید دستور mongo
را اجرا کنید! دستور mongo
یک Shell برای MongoDB است که به شما اجازه می دهد از طریق آن با پایگاه داده خود ارتباط برقرار کنید.
کاربران مک: ابتدا دستور mongod
را در یک ترمینال و سپس mongo
را در ترمینال دیگری اجرا کنید (ترمینال اول هیچ وقت بسته نشود). حالا آماده کدنویسی هستید.
کاربران ویندوز: دستور mongo
را اجرا کنید (نباید خطایی دریافت کنید). حالا آماده کدنویسی هستید.
برای تست کردن این موضوع ابتدا می خواهیم دستوری را اجرا کنیم که پایگاه های داده ما را به ما نشان می دهد. پس از انجام دادن کار های بالا، دستور show dbs
را اجرا نمایید. باید خروجی زیر را دریافت کنید:
admin 0.000GB config 0.000GB local 0.000GB
یعنی تا اینجای کار هیچ پایگاه داده ای که خودمان تعریف کرده باشیم، وجود ندارد. سه پایگاه داده بالا، به صورت پیش فرض روی MongoDB نصب هستند و ما با آن ها کاری نداریم.
اگر از کاربران ویندوز هستید و نمی توانید دستور بالا را اجرا کنید، به پوشه bin در مسیر نصب MongoDB بروید (معمولا در C:\Program Files\MongoDB\Server\4.2\bin
) و فایل mongod.cfg
را پیدا کنید. این فایل را با notepad باز کرده و به دنبال قسمتی بگردید که می گوید:
storage: dbPath: C:\Program Files\MongoDB\Server\4.2\data
شما باید این آدرس را به آدرس خودمان تغییر دهید (همان پوشه C:\data\db) بنابراین می گوییم:
storage: dbPath: C:\data\db
فایل را ذخیره کرده و ببندید. حالا یک پنجره ترمینال جدید را باز کنید و دستور زیر را در آن اجرا کنید:
net start MongoDB
با این دستور باید یکی از دو پیام زیر را دریافت کنید:
The MongoDB service is starting. The MongoDB service was started successfully.
The requested service has already been started.
این دو پیام در ویندوز نشان می دهند که سرویس MongoDB در حال اجرا است. حالا دوباره شروع کنید.
دستور mongo
را اجرا کرده و سپس show dbs
را اجرا نمایید. با این کار باید پیام زیر را دریافت کنید:
admin 0.000GB config 0.000GB local 0.000GB
در مرحله بعد دستور use را استفاده می کنیم. این دستور به ما اجازه می دهد که به یک پایگاه داده متصل شویم. حتی اگر آن پایگاه داده وجود نداشته باشد، به صورت خودکار ساخته شده و سپس به آن متصل می شویم بنابراین بیایید یک پایگاه داده جدید به نام shop را بسازیم:
use shop
با اجرای این دستور، پیام زیر را دریافت می کنید:
switched to db shop
یعنی به پایگاه داده shop متصل شده ایم. من می خواهم یک مقدار جدید (document) را درون یک collection ثبت کنم اما هنوز هیچ collection ای نداریم. دقیقا مانند دستور use می توانیم داده های خود را درون یک collection وارد کنیم و اگر آن collection وجود نداشته باشد به صورت خودکار ساخته خواهد شد:
db.products.insertOne({"name": "A Book", "price": 12.99})
بگذارید اجزای کد بالا را برایتان جداگانه توضیح بدهم:
توجه داشته باشید که در هنگام کار با Shell (همین حالتی که در آن هستیم و از طریق Command prompt یا Terminal با آن کار می کنیم) نیازی به گذاشتن quote ها برای key ها نیست بنابراین می توانیم برای راحت شدن کار کد بالا را به شکل زیر بنویسیم:
db.products.insertOne({name: "A Book", price: 12.99})
اما از آنجایی که A Book یک رشته است حتما باید درون quotation باشد. price (به معنی قیمت) یک عدد است بنابراین به quotation نیازی ندارد. با اجرای این کد باید پیام زیر را بگیرید:
"acknowledged" : true,
"insertedId" : ObjectId("5e81e834f3f63b0161dbd5e0")
مقدار true یعنی عملیات موفقیت آمیز بوده و داده شما در پایگاه داده ثبت شده است. مقدار insertedId نیز یک آیدی برای داده ما است که MongoDB به صورت خودکار تولید کرده است. حالا برای اینکه تمامی داده های درون collection خود را ببینیم، باید دستور زیر را اجرا کنیم:
db.products.find()
اگر هیچ آرگومانی به find ندهیم، تمام داده های درون products را برمی گرداند. بنابراین با اجرای کد بالا، خروجی زیر را می گیریم:
{ "_id" : ObjectId("5e81e834f3f63b0161dbd5e0"), "name" : "A Book", "price" : 12.99 }
اگر می خواهید نتیجه در یک خط نباشد و ظاهر بهتری پیدا کند باید پسوند pretty را به آن اضافه کنید:
db.products.find().pretty()
خروجی:
"_id" : ObjectId("5e81e834f3f63b0161dbd5e0"), "name" : "A Book", "price" : 12.99
نکته مهم: همانطور که در جلسه اول گفتم بسیار بهتر است از Cmder به جای command prompt پیش فرض ویندوز استفاده کنید. هم زیباتر و خواناتر است و هم قابلیت های بیشتری مانند کپی پیست ساده و غیره دارد.
تفاوت ظاهر و خواناتر بودن cmder به سادگی قابل تشخیص است.
حالا بیایید یک داده دیگر را نیز به collection خود اضافه کنیم:
db.products.insertOne({name: "A T-Shirt", price: 29.99, description: "This is a high quality T-Shirt"})
نکته: برای نوشتن این کد نیازی به نوشتن آن از صفر نیست. همانطور که در ترمینال خود هستید، کلید فِلِش به سمت بالا (up arrow key) را بزنید تا دستورات نوشته شده در قبل برایتان ظاهر شوند. هر بار که این کلید را می زنید یک دستور قدیمی تر برایتان نمایش داده می شود. به سادگی به دستور insertOne قبلی رفته و آن را ویرایش کرده و سپس enter بزنید. همچنین هر گاه که صفحه شلوغ شد می توانید دستور cls را اجرا کنید (ربطی به MongoDB ندارد و در تمام ترمینال ها قابل اجرا است) تا صفحه پاک شود (کدها از بین نمی روند، فقط ظاهر صفحه خالی می شود).
با اجرای این دستور داده جدید ما ثبت می شود. حالا دوباره دستور زیر را اجرا می کنیم تا داده هایمان را ببینیم:
db.products.find().pretty()
خروجی:
"_id" : ObjectId("5e81e834f3f63b0161dbd5e0"), "name" : "A Book", "price" : 12.99 } "_id" : ObjectId("5e81eb2ef3f63b0161dbd5e1"), "name" : "A T-Shirt", "price" : 29.99, "description" : "This is a high quality T-Shirt" }
از همین مثال می توان فهمید که MongoDB کاملا schemaless است یعنی از قبل ساختار تعریف شده ای ندارد. در حال حاضر یکی از داده ها (document ها) سه فیلد دارد و دیگری چهار فیلد.
نکته: برخی اوقات کدهایی را می نویسید و می خواهید سریعا در آن جا به جا شوید. با نگه داشتن کلید alt یا ctrl و سپس فشردن کلید های چپ و راست (right and left arrow keys) کیبورد، می توانید به جای کاراکتر به کاراکتر، کلمه به کلمه جا به جا شوید که سرعت جا به جایی را بسیار سریع تر می کند.
حالا بیایید یک داده تو در تو (nested) داشته باشیم. برای این کار دستور زیر را اجرا می کنم:
db.products.insertOne({name: "A Computer", price: 1229.99, description: "A high quality computer.", details: {cpu: "Intel i7 8770", memory: 32}})
همانطور که می بینید، detail یک شیء جداگانه درون شیء اصلی ما است بنابراین داده یا همان documentation ما دارای یک شیء دیگر درون خود است. حالا خروجی داده ها را با دستور زیر می گیریم:
db.products.find().pretty()
خروجی:
"_id" : ObjectId("5e81e834f3f63b0161dbd5e0"), "name" : "A Book", "price" : 12.99 } "_id" : ObjectId("5e81eb2ef3f63b0161dbd5e1"), "name" : "A T-Shirt", "price" : 29.99, "description" : "This is a high quality T-Shirt" } "_id" : ObjectId("5e81ed6cf3f63b0161dbd5e2"), "name" : "A Computer", "price" : 1229.99, "description" : "A high quality computer.", "details" : { "cpu" : "Intel i7 8770", "memory" : 32 } }
همانطور که مشاهده می کنید نتایج ما قابل رویت هستند. این جلسه برای آشنایی شما و بازی کردن با MongoDB Shell بود. بیشتر این دوره را در همین حالت (در ترمینال) می گذرانیم بنابراین بهتر است حتما از Cmder استفاده کنید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.