حالا که با data type ها (انواع داده) در MongoDB آشنا شده ایم باید به صورت عملی با آن ها کار کنیم تا تفاوت هایشان را درک کنیم. همانطور که در جلسه اول این فصل توضیح دادم، من باز هم تمام پایگاه های داده را حذف کرده ام تا از صفر شروع کنیم. برای شروع یک پایگاه داده دیگر به نام companyData را ایجاد می کنم:
use companyData
این پایگاه داده قرار است اطلاعات چند کمپانی یا شرکت مختلف را در خود داشته باشد. این شرکت ها حتما نامی دارند و این نام قطعا رشته است. سپس می خواهیم در خصوصیتی مشخص کنیم که آیا این شرکت یک شرکت استارتاپی است یا خیر بنابراین می توانیم از مقادیر Boolean استفاده کنیم. در مرحله بعد باید تعداد کارکنان این شرکت نیز مشخص شود و من فرض می کنم که این شرکت 33 کارمند داشته باشد. با این توصیفات برای document اول چنین کدی به دست می آید (هنوز آن را اجرا نکنید):
db.companies.insertOne({name: "Fresh Apples Inc", isStartup: true, employees: 33})
احتمالا می گویید تعداد کارمندان (employees) که 33 است بنابراین یک integer داریم. همانطور که در قسمت قبل توضیح دادم ما در محیط Shell هستیم و درون Shell اعداد، float (اعشاری) هستند چرا که shell بر اساس جاوا اسکریپت است و جاوا اسکریپت بین integer و float تفاوتی قائل نیست (نام دیگر float همان double است، البته در این دوره). با این حساب 33 به عنوان یک عدد float ذخیره خواهد شد چرا که از shell استفاده می کنیم اما در زبان های برنامه نویسی دیگر، به خود زبان برنامه نویسی مربوط است.
در مرحله بعد می خواهیم بودجه این شرکت را تعیین کنیم که عددی بزرگ است (برای آنکه یادمان نرود از 1 تا 9 رفته، سپس یک صفر می گذارم و دوباره از 1 تا 9 می روم). سپس یک فیلد details هم خواهیم داشت که فعلا فقط نام CEO (مدیر عامل شرکت) را در خود دارد. در نهایت باید لیستی از تگ ها را داشته باشیم و لیست ها با آرایه ها ایجاد می شوند بنابراین (هنوز اجرا نکنید):
db.companies.insertOne({name: "Fresh Apples Inc", isStartup: true, employees: 33, funding: 1234567890123456789, details: {ceo: "Mark Super"}, tags:[{title: "super"}, {title: "perfect"}]})
همانطور که گفتم درون آرایه ها می توانیم از انواع و اقسام داده ها استفاده کنیم (document های دیگر مانند کد بالا، اعداد، رشته ها و الی آخر). در مرحله بعد می خواهم تاریخ تاسیس شرکت را نیز ذکر کنم. درون shell برای ایجاد یک تاریخ جدید می توانیم از دستور new Date استفاده کنیم و اگر چیزی را به عنوان آرگومان به آن پاس ندهیم، تاریخ فعلی را در نظر می گیرد و آن را ثبت می کند. همچنین باید یک timestamp داشته باشیم که مشخص کند این document در چه زمانی در collection ثبت شده است. باز هم اگر چیزی را به عنوان آرگومان به آن پاس ندهیم، timestamp بر اساس زمان فعلی (لحظه ثبت دستور) تولید می شود. با این تفاسیر می توان گفت:
db.companies.insertOne({name: "Fresh Apples Inc", isStartup: true, employees: 33, funding: 1234567890123456789, details: {ceo: "Mark Super"}, tags:[{title: "super"}, {title: "perfect"}], foundingDate: new Date(), insertedAt: new Timestamp()})
این متد ها (new date و new timestamp) توسط shell ارائه می شوند و اگر در حال توسعه یک برنامه واقعی هستید، باید به بخش documentation مربوط به زبان برنامه نویسی خودتان در وب سایت MongoDB Driver Docs مراجعه کنید و متد های آن را یاد بگیرید.
با اجرای دستور بالا، documentation جدید ما در companies ساخته می شود. حالا یکی از دستورات زیر را اجرا کنید تا نتیجه را ببینیم:
db.companies.find().pretty() db.companies.findOne()
هر کدام را که اجرا کنید یک خروجی دریافت خواهیم کرد (اگر به findOne آرگومانی ندهیم، آخرین document ثبت شده را برمی گرداند). خروجی:
"_id" : ObjectId("5e8569bfa6a97e5e05dd3cfe"), "name" : "Fresh Apples Inc", "isStartup" : true, "employees" : 33, "funding" : 1234567890123456800, "details" : { "ceo" : "Mark Super" }, "tags" : [ { "title" : "super" }, { "title" : "perfect" } ], "foundingDate" : ISODate("2020-04-02T04:27:43.032Z"), "insertedAt" : Timestamp(1585801663, 1)
بنابراین تمام اطلاعات ما به شکل صحیح ذخیره شده اند البته دوست دارم در مورد زمان ها توضیحی بدهم. در نتیجه برگردانده شده برای تاریخ تاسیس شرکت (foundingDate) مقدار زیر را می بینیم:
ISODate("2020-04-02T04:27:43.032Z")
رشته ای که می بینید تا قبل از T تاریخ را نشان می دهد (سال، ماه، روز). T مخفف time است، یعنی پس از آن زمان را می بینید (ساعت، دقیقه، ثانیه). در نهایت نقطه ای گذاشته شده و عبارت 032Z نمایش داده می شود که Z مخفف time zone است و عدد قبل از آن هم یک کد خاص برای time zone من است. timestamp نیز همان عدد خاصی است که بر اساس زمان (میلی ثانیه) ساخته می شود. از آنجایی که حتما با زبان های برنامه نویسی آشنا هستید که به سراغ یادگیری پایگاه داده آمده اید، مطمئن هستم که می دانید timestamp چیست و نیازی به توضیح ندارد.
نکته بسیار جالب دیگر در کد بالا مقدار funding است که به صورت 1234567890123456800 ذخیره شده است! این عددی نبود که ما وارد کرده ایم! اگر به کد های بالا نگاه کنید، مشخص است که من عدد 1234567890123456789 را وارد کرده ام. چرا چنین اتفاقی افتاده است؟ ما در shell هستیم بنابراین بر اساس جاوا اسکریپت کار می کنیم و این عدد بیش از حد بزرگ است. در جاوا اسکریپت یک عدد float به طور 64 بیت است اما عددی که ما وارد کرده ایم بزرگ تر از این حرف ها است. این یکی از محدودیت های کار با اعداد است. اگر می خواهید اعداد بسیار بزرگی را ذخیره کنید (بالای تریلیون) بهتر است آن ها را به صورت یک رشته ذخیره کنید.
در قسمت بعد کمی بیشتر در مورد اعداد صحبت خواهیم کرد (البته یک فصل جداگانه را برای آن تدارک دیده ایم و اینها مقدمات است).
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.