در قسمت قبل تا حدی با انواع داده ها در عمل آشنا شدیم البته چند نکته باقی مانده است که آن ها را در این قسمت تکمیل خواهیم کرد. برای شروع این جلسه از همان پایگاه داده companyData استفاده می کنم اما یک collection جدید به نام numbers ایجاد خواهم کرد:
db.numbers.insertOne({a: 1})
از جلسه قبل می دانیم که در shell اعداد به صورت Float و 64 بیتی ذخیره می شوند، بنابراین عدد بالا نیز به همین صورت ذخیره می شود. حالا برای مشاهده نتیجه می توانیم دستور زیر را اجرا کنیم:
db.numbers.findOne()
نتیجه اجرای این دستور به شکل زیر است:
{ "_id" : ObjectId("5e86cf0e68288536b120cb0f"), "a" : 1 }
تا اینجا چیز غیر منتظره ای وجود ندارد اما اگر از دستور stats استفاده کنم (مخفف statistics - به معنی «آمار») نکته جالبی دیده می شود. قبل از اجرای آن، دستور زیر را اجرا کنید تا companies (همان collection جلسه پیش) را حذف کنیم:
db.companies.drop()
با این کار collection ما حذف می شود. حالا دستور زیر را اجرا کنید:
db.stats()
stats از متدهای shell است که «آمار» و گزارشاتی را در مورد این پایگاه داده به ما می دهد.
"db" : "companyData", "collections" : 1, "views" : 0, "objects" : 1, "avgObjSize" : 33, "dataSize" : 33, "storageSize" : 20480, "numExtents" : 0, "indexes" : 1, "indexSize" : 20480, "scaleFactor" : 1, "fsUsedSize" : 39002718208, "fsTotalSize" : 76021755904, "ok" : 1 }
همانطور که می بینید نتیجه برگشتی شامل اطلاعاتی از پایگاه داده است (مثلا تعداد collection و غیره). از شما می خواهم روی مقدار 33 که برای dataSize (اندازه داده ها) برگردانده شده، تمرکز کنید. حالا می خواهم تنها collection موجود در numbers را حذف کنم بنابراین می گویم:
db.numbers.deleteMany({})
سپس دوباره stats را اجرا می کنیم:
db.stats()
از نتیجه برگردانده شده، قسمت dataSize برای ما مهم است که صفر می باشد چرا که تنها داده درون numbers را نیز حذف کردیم. تا اینجا همه چیز طبق معمول پیش رفته است. حالا بگذارید من دستور insertOne را دوباره اجرا کنم:
db.numbers.insertOne({a: NumberInt(1)})
این بار به جای آنکه 1 را مستقیما پاس بدهم، از متدی به نام NumberInt استفاده کرده ام که باعث ذخیره شدن عدد 1 به صورت یک عدد 32 بیتی ذخیره می کند (به جای حالت پیش فرض که 64 بیتی است). حالا دوباره db.stats را اجرا می کنم و نتیجه زیر را می گیرم:
"db" : "companyData", "collections" : 1, "views" : 0, "objects" : 1, "avgObjSize" : 29, "dataSize" : 29, "storageSize" : 24576, "numExtents" : 0, "indexes" : 1, "indexSize" : 24576, "scaleFactor" : 1, "fsUsedSize" : 39003127808, "fsTotalSize" : 76021755904, "ok" : 1 }
حالا می بینید که dataSize کوچک تر شده است (29)! دلیل این اتفاق را در جلسه پیش هم عرض کردم. Shell بر اساس جاوا اسکریپت است و جاوا اسکریپت فرقی بین Float (اعشار) و integer (عدد صحیح) نمی گذارد اما در بسیاری از زبان های دیگر اینطور نیست. بنابراین اگر از PHP یا Node.js یا هر زبان دیگری استفاده می کنید، نباید چنین مشکلی را داشته باشید. به هر حال در صورتی که چنین مشکلی وجود داشت، باید با مراجعه به documentation رسمی MongoDB Drivers به قسمت زبان مورد نظر خودتان رفته و معادل NumberInt و توابع دیگر را پیدا کنید تا از آن ها استفاده کنید.
از قسمت بعد وارد مباحث relation و ارتباطات بین داده ای در MongoDB می شویم بنابراین دوست دارم در انتهای این قسمت جمع بندی کلی از مباحث مطرح شده در جلسات قبل داشته باشیم.
1 - هر document تنها می تواند 16 مگابایت حجم داشته باشد (با احتساب تمام document های تو در توی داخل خود).
2- شما می توانید تا 100 بار Document های تو در تو داشته باشید (100 سطح از embedded document یا Array ها).
3- اعداد صحیح عادی (Normal integers) از نوع int32 (32 بیتی) هستند و حداکثر عددی که می توانند در خود نگه دارند 2,147,483,647 است (چه مثبت، چه منفی).
4- اعداد صحیح طولانی (Long integers) از نوع int64 (64 بیتی) هستند و می توانند تا عدد 9,223,372,036,854,775,807 را در خود نگه دارند (چه مثبت، چه منفی).
5- اعداد به غیر از محدودیت 16 مگابایتی کلی، محدودیت دیگری ندارند.
6- همانطور که گفتم متد ()NumberInt یک مقدار 32 بیتی می سازد و NumberLong یک عدد 64 بیتی.
7- در Shell اگر عددی را به طور عادی وارد کنید، آن عدد به صورت یک double یا همان float ثبت می شود چرا که shell بر اساس جاوا اسکریپت است و جاوا اسکریپت اعداد صحیح را نمی شناسد (همه چیز برایش اعشاری است) و همانطور که گفته شد float ها گِرد می شوند. اگر می خواهید از decimal (اعداد اعشاری با دقت بالا) استفاده کنید تا گِرد نشوند باید از متد ()NumberDecimal استفاده نمایید.
8- در برنامه های واقعی که از زبان برنامه نویسی (نه از Shell) استفاده می کنید، باید به قسمت drivers در وب سایت MongoDB بروید و با متدهای مورد نظر آشنا شوید. مثلا متدهای مربوط به numberLong برای زبان Node.js در لینک http://mongodb.github.io/node-mongodb-native/3.1/api/Long.html قرار دارند. من مثالی را در کد زیر برایتان آورده ام که در آن یک numberLong ساخته ام:
const Long = require('mongodb').Long; db.collection('wealth').insert( { value: Long.fromString("121949898291") });
9- تمام محدودیت های MongoDB به طور مفصل در لینک https://docs.mongodb.com/manual/reference/limits/ توضیح داده شده اند.
10- اگر دوست دارید جزئیات هر کدام از data type ها را به دقت مطالعه کنید، می توانید به بخش مربوطه در وب سایت MongoDB سر بزنید: https://docs.mongodb.com/manual/reference/bson-types/
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.