# مانگودی‌بی

مانگودی‌بی|  |
| نویسنده(های) اصلی | 10gen |
| توسعه‌دهنده(ها) | 10gen |
| مخزن | * github.com/mongodb/mongo
 |
| سیستم‌عامل | چندسکویی |
| مجوز | گنو آجی‌پی‌ال نسخه ۳٫۰ (ابزارهای ارتباط با این پایگاه داده تحت مجوز آپاچی هستند) |
| وبگاه |   |

**مانگودی‌بی** (به انگلیسی: MongoDB (برگرفته از «humongous») یک پایگاه داده‌های سند-گرای متن‌باز، کارا، مقیاس‌پذیر، بدون نیاز به طرح‌بندی اولیه نوشته شده در زبان برنامه‌نویسی سی++ است.

هدف مانگودی‌بی پرکردن فاصلهٔ ذخیره‌بندی‌های کلید/مقداری که سریع و مقیاس پذیر هستند و سامانه‌های سنتی مدیریت پایگاه داده رابطه‌ای که درخواست‌های غنی و عملکرد عمیقی دارند— بوده‌است. مانگودی‌بی برای رفع مشکلاتی طراحی شده که با پایگاه داده‌های رابطه‌ای به سادگی رفع نمی‌شوند؛ برای مثال اگر پایگاه داده کارسازهای زیادی را دربرگیرد.

مانگودی‌بی به جای اینک همانند پایگاه‌های داده‌های رابطه‌ای کلاسیک داده‌ها را در جداول ذخیره کند، داده‌های ساختاریافته را در اسنادی با قالبی شبیه به جی‌سان (مانگودی‌بی این قالب را بی‌سون(BSON) می‌نامد) ذخیره‌سازی می‌کند، و بدین ترتیب یکپارچه‌سازی داده‌ها را در برخی اقسام برنامه‌های کاربردی آسان‌تر و سریع‌تر می‌کند.

## تاریخچه

توسعه مانگودی‌بی در 10gen در سال ۲۰۰۷، هنگامی که شرکت در حال ایجاد یک بستر به عنوان سرویس مشابه با ویندوز آژور یا گوگل اپ انجین بود، آغاز شد. در سال ۲۰۰۹ مانگودی‌بی عنوان یک محصول مستقل و متن باز با مجوز آجی‌پی‌ال ارائه شد.

در ماه مارس ۲۰۱۰، با شروع از نسخه ۱٫۴، مانگودی‌بی قابل استفاده در خط تولید شناخته شد.

## مجوز و پشتیبانی

مانگودی‌بی به صورت آزاد تحت پروانه عمومی همگانی آفرو در دسترس است. درایور زبان‌های مختلف تحت پروانه آپاچی در دسترس هستند. علاوه بر این، 10gen پروانه‌های تجاری برای مانگودی‌بی ارائه می‌دهد.

## نکات برجسته اصلی

در زیر خلاصه‌ای از برخی از ویژگی‌های اصلی آمده‌است:

* **پرس و جوهای تک کاره**: مانگودی‌بی از جستجو بر اساس فیلد، پرس و جوهای بازه‌ای، و جستجوهای با عبارت منظم پشتیبانی می‌کند.
* **فهرست بندی**: هر فیلدی در مانگودی‌بی قابل فهرست بندی است. فهرست‌های ثانویه نیز موجود هستند.
* **انعکاس**: مانگودی‌بی از انعکاس تابع-متبوع (master-slave) پشتیبانی می‌کند. هر متبوعی قادر به انجام نوشتن‌ها و خواندن‌ها است. یک تابع داده‌ها را از متبوع رونوشت می‌کند و تنها برای خواندن‌ها یا پشتیبانی به کار می‌رود. تابع‌ها توانایی انتخاب متبوع جدید در صورت از کار افتادن متبوع فعلی را دارند.
* **توازن بار**: مانگودی‌بی با استفاده از بخش‌بندی (sharding) قابل مقیاس پذیری به صورت افقی است. شخص توسعه دهنده کلید بخش‌بندی را انتخاب می‌کند که مشخص می‌کند داده در یک مجموعه چگونه توزیع خواهد شد. داده بر مبنای کلید بخش‌بندی به بازه‌های مختلف تکه‌تکه می‌شود و در بخش‌های مختلف توزیع می‌شود. (هر بخش یک متبوع با یک یا چند تابع است).
* **ذخیره‌سازی فایل**: از مانگودی‌بی می‌توان به عنوان یک سیستم فایل استفاده کرد و از مزایای توازن بار و انعکاس داده در چندین ماشین برای ذخیره فایل‌های استفاده کرد.
* **تجمیع**: برای پردازش دسته‌ای داده‌های و عملیات تجمیع می‌توان از نگاشت‌کاهش استفاده کرد.
* **اجرای جاواسکریپت سمت سرور **مجموعه‌های دربسته**

برای اطلاعات بیشتر دربارهٔ موارد بالا به کتابچه ی توسعه‌دهندگان مانگودی‌بی مراجعه کنید.

## امکانات

برخی از این ویژگی ها عبارتند از :

1. رمزگذاری ثابت UTF-8. داده های غیر UTF-8 را می توان با یک نوع داده باینری خاص ذخیره، پرس و جو و بازیابی کرد.
2. MongoDB را می توان تقریباً بر روی هر سیستم کوچک endian کامپایل کرد.
3. از تاریخ ها، عبارات منظم، کد، داده های باینری و موارد دیگر پشتیبانی می کند (همه انواع BSON)
4. نشانگر برای نتایج کوئری ( جست و جو )

برخی از ویژگی های پیچیده تر عبارتند از:

### پرس و جوهای موقت

بر خلاف بسیاری از راه حل های پایگاه داده غیر رابطه ای دیگر، هر فیلدی را می توان در هر زمانی جستجو کرد. MongoDB از پرس‌و‌جوهای محدوده، جستجوهای عبارات منظم، و دیگر انواع خاص پرس‌و‌جوها علاوه بر فیلدهای دقیقاً منطبق، پشتیبانی می‌کند. کوئری ها همچنین می توانند شامل توابع جاوا اسکریپت تعریف شده توسط کاربر باشند (اگر تابع true باشد، سند مطابقت دارد).
پرس و جوها می توانند فیلدهای خاصی از اسناد (به جای کل سند) و همچنین مرتب سازی، پرش و محدود کردن نتایج را برگردانند.

### جستجو در زمینه های تودرتو

کوئری‌ها می‌توانند به اشیاء و آرایه‌های تعبیه‌شده دسترسی پیدا کنند. اگر شی جاوا اسکریپت زیر در مجموعه کاربران درج شود:

```
  {
      "username" : "Mehdi",
      "address" : {
          "street" : "AhmadAbad",
          "city" : "Mashhad",
          "state" : "IR"
      }
  }
```

ما می‌توانیم برای این سند (و همه اسناد با شهر در مشهد) پرس و جو کنیم:

```
> db.users.find({"address.city" : "Mashhad"})
```

عناصر آرایه را نیز می توان پرس و جو کرد:

```
> db.food.insert({"fruit" : ["peach", "pear", "plum"]})
> db.food.find({"fruit" : "pear"})
```

## موارد استفاده و استقرار

با توجه به مقاله «موارد استفاده» در وب سایت مانگودی‌بی، مانگودی‌بی برای موارد زیر مناسب است:

* بایگانی و ثبت رخدادها
* سامانه‌های مدیریت محتوا و سندها
* تجارت الکترونیکی
* بازی سازی
* مسئله‌های حجم بالا
* موبایل
* نگهداری داده در یک وب سایت
* پروژه‌های که از روش‌های توسعه چابک استفاده می‌کنند
* آمار و تحلیل‌های بی‌درنگ

### شرکت‌هایی که از مانگودی‌بی استفاده می‌کنند

لیست شرکت‌هایی که از مانگودی‌بی استفاده می‌کنند شامل موارد زیر است:

|  |  |  |  |
| --- | --- | --- | --- |
| * شبکه‌های ام‌تی‌وی
* کریگزلیست
* گروه رسانه تعاملی دیسنی
* وردنیک
 | * نرم‌افزار دیاسپورا
* شاترفلای
* فوراسکویر
* بیتلی
* نیویورک تایمز
 | * سورس‌فورج
* بیزینس اینسایدر
* اتسی
* برخورددهنده بزرگ هادرون سرن
* تامبتک
 | * اپاسکیل
* اوبر
* گاردین
* بارکلیز
* Globo.com
 |

برای لیست کامل و ارجاع به هر مورد استفاده خاص به مقاله "Production Deployments" در وب‌سایت مانگودی‌بی مراجعه کنید.

## مجموعه‌ها و اسناد

مانگودی‌بی داده‌های دارای ساختار را در اسنادی با قالبی شبیه جی‌سون (JSON) به اسم بی‌سون (BSON) ذخیره می‌کند. در مانگودی‌بی داده‌ها دارای طرح از پیش تعیین شده نیستند.

یک عنصر داده **سند** (document) نامید می‌شود، و سندها در **مجموعه‌ها** (collection) ذخیره می‌شوند. هر مجموعه ممکن است دارای هر تعداد از سندها باشد.

در مقایسه با پایگاه‌های دادهٔ رابطه‌ای، می‌توان گفت که مجموعه‌ها شبیه جدول‌ها، و سندها شبیه رکوردها هستند؛ ولی یک تفاوت بزرگ وجود دارد: تمام رکورد در یک جدول باید دارای فیلدهای یکسان و با ترتیب یکسان باشند، اما هر سند در یک مجموعه ممکن است دارای فیلدهای متفاوتی از سندهای دیگر باشد. تنها الزام برای طرح‌های سندها (علاوه بر محدودیت‌های اندازه) این است که هر سندی باید دارای فیلد '\_id' با مقدار منحصر به فرد و غیر آرایه‌ای باشد.

یک جدول در پایگاه داده رابطه‌ای را می‌توان به صورت زیر نشان داد:

| Last Name | First Name | Date of Birth |
| --- | --- | --- |
| DUMONT | Jean | ۰۱-۲۲-۱۹۶۳ |
| PELLERIN | Franck | ۰۹-۱۹-۱۹۸۳ |
| GANNON | Dustin | ۱۱-۱۲-۱۹۸۲ |

*هر رکورد در یک جدول دارای فیلدهای یکسان و با ترتیب یکسان است.*
در مقابل، یک مجموعه مانگودی‌بی شبیه زیر است:

```
{
 "\_id": ObjectId("4efa8d2b7d284dad101e4bc9"),
 "Last Name": "DUMONT",
 "First Name": "Jean",
 "Date of Birth": "01-22-1963"
},
{
 "\_id": ObjectId("4efa8d2b7d284dad101e4bc7"),
 "Last Name": "PELLERIN",
 "First Name": "Franck",
 "Date of Birth": "09-19-1983",
 "Address": "1 chemin des Loges",
 "City": "VERSAILLES"
}

```

*هر سند در یک مجموعه مانگودی‌بی ممکن است فیلدهای متفاوتی داشته باشد.*
در هر لحظه می‌توان در یک سند، فیلد جدید اضافه کرد یا فیلدهای قبلی را تغییر نام داد یا حذف کرد. هیچ طرح پیش تعریف شده‌ای وجود ندارد. ساختار سند بسیار ساده است: از فرمت جی‌سون پیروی می‌کند، و شامل دنباله‌ای از جفت‌های کلید-مقدار است؛ بنابراین هر سند معادل آنچه در زبان‌های برنامه‌نویسی مختلف آرایه انجمنی، نگاشت، دیکشنری، یا جدول هش نامیده می‌شود است. کلید در جفت کلید-مقدار نام فیلد است، و مقدار در جفت کلید-مقدار محتوای فیلد است. کلید و مقدار با یک علامت ":" از هم جدا می‌شوند.

یک مقدار می‌تواند عدد، رشته، صحیح و ناصحیح، داده‌های دودویی مانند تصویر، آرایه‌ای از مقادیر (که هر عضو می‌تواند از نوع متفاوتی باشد)، یا یک زیرسند کامل باشد:

```
{
 "\_id": ObjectId("4efa8d2b7d284dad101e4bc7"),
 "Last Name": "PELLERIN",
 "First Name": "Franck",
 "Date of Birth": "09-19-1983",
 "phoneNumber": [
 {
 "type": "home",
 "number": "212 555-1234"
 },
 {
 "type": "fax",
 "number": "646 555-4567",
 "verified": false
 }
 ],
 "Address": {
 "Street": "1 chemin des Loges",
 "City": "VERSAILLES"
 },
 "Months at Present Address": 37
}

```

*در اینجا مشاهده می‌کنیم که فیلد "Address" شامل یک زیر سند است که دارای دو فیلد "Street" و "City" است.*

## زبانهای پشتیبانی شده

مانگودی‌بی راه‌اندازهای زیر را به‌طور رسمی دارد:

|  |  |  |  |
| --- | --- | --- | --- |
| * سی
* سی++
* سی# / دات‌نت
 | * ارلنگ
* هاسکل
* جاوا
* جاوااسکریپت
 | * لیسپ
* نود.جی‌اس
* پرل
* پی‌اچ‌پی
 | * پایتون
* روبی
* اسکالا
 |

زبان برنامه‌نویسی تحت وب اوپا(Opa) نیز دارای پشتیبانی توکار از مانگودی‌بی است، که به صورت کامل با زبان یکپارچه شده‌است، و لایهٔ امنیت انواع را بر روی مانگودی‌بی ارائه می‌دهد.

در ضمن تعداد زیادی راه انداز غیررسمی برای زبان‌های
کلدفیوژن, دلفی, لوا, روبی, اسمال‌تاک و سایر زبان‌ها وجود دارد.

## ابزارهای مدیریتی و گرافیکی

### ابزارهای مانگودی‌بی

* **mongoDb compass**  : یک محیط گرافیکی برای مدیریت دیتابیس های مانگو‌دی‌‌بی است که توسط توسعه دهندگان اصلی مانگو‌دی‌‌بی توسعه یافته است.

**پس از نصب مانگودی‌بی، دستورهای زیر در دسترس هستند: **mongo**: شل تعاملی که برای مشاهده، افزودن، تغییر، و حذف داده در پایگاه‌های داده، و همچنین مشاهدهٔ اطلاعات انعکاس، تنظیم بخش‌بندی، خاموش کردن سرورها، اجرای جاوااسکریپت، … به کار می‌رود.
* **mongostat**: برای مشاهدهٔ فهرست خلاصه آمار وضعیت نمونهٔ در حال اجرای مانگودی‌بی به کار می‌رود: چه تعداد عملیات درج، تغییر، حذف، پرس و جو انجام شده‌است، و همچنین درصد زمانی که پایگاه داده در آن قفل بوده‌است و مقدار حافظهٔ مصرف شده توسط پایگاه داده.
* **mongotop**: برای پیگری مدت زمانی که مانگودی‌بی صرف خواندن و نوشتن داده می‌کند به کار می‌رود.
* **mongoimport, mongoexport**: برای تبدیل مجموعه‌ها به و بازیابی مجموعه‌ها از قالب‌های JSON, CSV، یا TSV به کار می‌روند.
* **mongodump, mongorestore**: برای تهیهٔ نسخهٔ پشتیبان و بازیابی از نسخهٔ پشتیبان به کار می‌روند.

## جستارهای وابسته

* مای‌اس‌کیوال
* زنجیره بلوکی (بلاکچین)

## پانویس

## منابع

* ویکی‌پدیای انگلیسی

## پیوند به بیرون

* وبگاه رسمی مانگودی‌بی
* What is MongoDB? MongoDB در یوتیوب