Mongo Database

از ویکی پارس پویش
ویرایش در تاریخ ‏۲۶ نوامبر ۲۰۱۴، ساعت ۱۴:۳۴ توسط Farshad (بحث | مشارکت‌ها)

پرش به: ناوبری, جستجو

محتویات

MongoDB چیست؟

تمرکز در: سرعت و قدرت، انعطاف پذیری، مقیاس پذیری، گسترش پذیری

مقدمه

پایگاه داده MongoDB یکی ازبهترین پایگاه داده های بدون رابطه ایی می‌باشد که بسیار انعطاف پذیر و قوی و سریع و گسترش پذیر می‌باشد. مدل دادها بصورت json می باشند. قواعد و دستورالعملها همان قواعد نحوی(syntax) جاوا اسکریپت می‌باشند که رابط shell آن از قواعد جاوا اسکریپت پیروی میکند.بنابراین بسیار ساده و آسان می‌باشد. بعضی از ویژگیهای مونگو بسیار شبیه به مدل پایگاه داده sql می باشد، اما بعضی ویژگی‌های در مونگو وجود ندارند. نظیر:join ها یا trigger ها یا تراکنش های چند سطری پیچیده، که پیاده سازی آنها به روش های برنامه نویسی قابل انجام است.


مفاهیم اصلی

سندها یا Documents

سندها همان مفهوم ردیف ها در دیتابیس های رابطه ایی(sql) می باشند

مجموعه ها یا collection

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

دیتابیس

این مفهوم دست نخورده باقی‌مانده و همان مفهوم DB در دیتابیس های رابطه‌ای می‌باشد.


ویژگی ها

سندگرا

  • سندها بسیار شبیه به نوع داده ایی دیکشنری در زبان‌های برنامه نویسی بوده و به همین منظور برای برنامه نویس بسیار راحت می‌باشد.
  • قابلیت سندگرا و آرایه ای بودن نیاز به اتصال های اضافی را کاهش داده است.
  • اسکیمای داینامیک آن باعث ایجاد چندریختی های آسانتر شده
  • هر سند دارای یک کلید مخصوص “_id” هست که در بین سندهای یک مجموعه یکتا هست.

قدرتمند و سریع

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

میرورینگ و کلاسترینگ

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

سرویس کلاسترینگ MongoDB بیشتر برای سازمان و شرکتهایی به کار میرود که برنامه ی آنها تحت هر شرایطی باید اجرا شود و در حالت اجرا باقی بماند حتی زمانی که یکی از سرورها از سرویس خارج شده باشد. در سرویس کلاسترینگ تمامی سرورها همان برنامه و قوانینی را که باقی سرورها اجرا میکنند اجرا خواهند کرد لذا اگر سروری از سرویس خارج شود باقی سرورها بلافاصه شروع به کار خواهند کرد که به آن Failover گفته میشود. زمانی که سرور از سرویس خارج شده دوباره به کار افتاد باقی سرورها آگاه میشوند و روند عادی دوباره ادامه خواهد یافت. به این عمل Failback گفته میشود

گسترش پذیری آسان

زمانی که چند سرور برنامه MongoDB را با یکدیگر اجرا میکنند که نتیجه آن احتمال خطای کمتر و سرعت لود بالاتربرنامه هاست. MongoDB بر پایه scale out بودن طراحی شده است، سندگرا بودن مدل داده‌ها این اجازه را میدهد که داده‌ها به طور جداگانه در روی چندین سرور پخش شوند که داده‌ها و لود کردن یک گروه را به تعادل می‌رساند. توزیع مجدد دسته ها اتوماتیک است که این امکان را میدهد که برنامه نویسان بدون نگرانی از ذخیره داده‌ها روی برنامه نویسی تمرکز کنند به این تکنیک شارد(Shard) گفته می‌شود که مجموعه ها و داده را در بین چندین سرور بصورت خودکار و اتوماتیک انجام می‌دهد.

رابط چندگانه

دارای API های زبان‌های عمومی بوسیله Driverها و shell مونگو می‌باشد.


نصب و راه اندازی

نحوه نصب MongoDB بر روی سیستم عامل Debian

برای نصب در ابتدا باید آرشیو مونگو را به مخازن اضافه نماییم:

۱-

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10



۲-

echo 'deb http://downloads-distro.mongodb.org/repo/debian-sysvinit dist 10gen' | sudo tee /etc/apt/sources.list.d/mongodb.list



۳- حال در این مرحله آرشیو پکیج های خود را آپدیت نمایید:

sudo apt-get update



۴- در این مرحله آخرین نسخه پایدار مونگو را نصب می کنیم:

sudo apt-get install mongodb-10gen


نحوه نصب درایور پایتون مونگو

برای اینکه بتوانیم با پایتون به مونگو وصل شویم باید درایور یا بسته یا کتابخانه pymongo را بر روی سرور نصب نماییم.

برای نصب pymongo فقط کافیست با pip آن را نصب نمایید:

pip install pymongo




شروع آموزش

سند ها

سندها بصورت object می‌باشند:

{'key': 'value'}

ترتیب و ارزش‌ها اهمیت دارند:

{'key2': 'value2', 'key1': 'value1'}

متفاوت از

{'key1': 'value1', 'key2': 'value2'}

مونگو case-sensitive و type-sensitive می‌باشد.

سند در مونگو نمی‌تواند دارای کلید تکراری باشد! سند زیر غلط می‌باشد:

{'key': 'value2', 'key': 'value1'}

mongo

برای کار با مونگو در محیط shell بنویسید

mongo

برای وصل شدن به دیتا بیسی باید از دستور use استفاده کنید.

توجه داشته باشید که شما حتی بدون اینکه از پیش پایگاه داده ای را ایجاد کرده باشید دستور use عمل سوییچ به آن پایگاه را برای شما آنجام میدهد، زیرا که دیتابیس و collection ها در ورود اولین سند بصورت runtime ساخته می‌شود.

use test

ایجاد سند

برای ساخت سند باید از دستور insert استفاده شود:

db.test.insert({exam: “test1”})

با دستور find میتوانیم از صحت ورود اطلاعات اطمینان حاصل نماییم:

db.test.find()

خروجی بصورت زیر خواهد بود،

‫{‬ ‫‪_id‬‬ ‫‪:‬‬ ‫‪ObjectId("4bf9bec50e32f82523389314"),‬‬‫‪username‬‬ ‫‪:‬‬ ‫”test1” ‫}‬

ساختار find

ساختار این دستور:

این دستور دو پارامتر بسیار مهم را دریافت میکند:


۱-criteria که مربوط به کوئری بوده

db.collection.find( { کوئری شما}, { name: 1, contribs: 1 } )


۲-projection که مربوط ساختار خروجی شما می‌باشد

{ field1: <boolean>, field2: <boolean> ... }

همینطور با دستور save هم میتوان سند ایجاد کرد:

db.test.save({exam: “test2”})


با دستور زیر میتوان تعداد رکورد های موجود را شمارش کرد:

db.test.count()


برای جستوجو در عناصر از find میتوان استفاده کرد، به این صورت که شرط را بصورت یک دیکشنری به آن پاس میدهیم:

db.test.find({exam: “test1”})

ویرایش داده ها

با دستور update میتوان اطلاعات را ویرایش نمود:

‫‪db.test.update({exam‬‬ ‫‪:”test1”},‬‬ ‫‪{$set:‬‬ ‫‪{country:‬‬ ‫”Canada”)}}‬


در این مثال به رکورد exam مقدار country را به حالت free-schema اضافه نمودیم.

با استفاده از دستور unsetمیتوانیم مقادیر را پاک نماییم.


حذف داده ها

حذف مقادیر با دستور removeمی باشد.

db.test.remove({key and value})

دستور remove فقط اسناد داخل مجموع را پاک میکند، برای حذف کامل مجموعه با تمام index هایش از دستور drop استفاده می نماییم.

db.test.drop()

توجه داشته باشید که drop تمام کالکشن را پاک می نماید!

JavaScript

تمام دستورات جاوا اسکریپت در shell مونگو قابل استفاده هستند

for(i=0; i<200000; i++) {
db.test.save({num: i});
}

با دستور count میتوانیم مطمن بشویم که ۲۰۰۰۰۰ رکورد در کالکشن درج شده است:

db.test.count()


Index

با ایندکس گذاری قادر خواهیم بود رکورد ها را بر دو اساس صعودی و نزولی مرتب نماییم که این امر باعث سرعت بسیار بالای فعل انفعالات در کالکشن مذبور می‌باشد.

db.test.ensureIndex({num: 1})


موضوع Background Construction:

در حالت پیشفرض هنگام ایندکس سازی، مجموعه مورد نظر از هر نظر بلاک میشود، برای بر طرف ساختن این موضوع از پارامتر background استفاده نمایید:

db.people.ensureIndex( { zipcode: 1}, {background: true} )


رابط PyMongo

بسته PyMongo یک ابزار پایتونی برای کار با مونگو می باشد، و پیشنهاد می‌شود که اگر پایتون کار هستید و میخواهید با مونگو کار کنید حتماً از این ابزار استفاده نمایید.

برای نصب:

pip install pymongo

بهترین منبع برای یادگیری PyMongo


نگاهی مختصر به PyMongo

در این قسمت نگاهی کوتاه در حد آشنایی با PyMongo خواهیم داشت.

در گام اول کتابخانه PyMongo رو وارد میکنیم:

import pymongo


در گام بعد یک نمونه از mongod(زمانی که مونگو بر روی سیستم نصب باشد، این سرویس باید فعال باشد) میسازیم:

client = pymongo.MongoClient()


یا

Client = pymongo.MongoClient('localhost', 27017)

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

url = "mongodb://%s:%s@%s:%s" % (username, password, host, port)
Client = MongoClient(url, max_pool_size=None)


نکته: max_pool_size برای تعیین connection pool شما هست، که یا میتوانید مقدار صحیح وارد نمایید، یا مقدار آن را None بگذارید تا خودش بصورت نامحدود بر حسب نیاز pool ایجاد نماید.


شما در چندین حالت میتوانید دیتابیس خود رابسازید:

1 -

db = client.test_database

2 -

db = client['test-database']

برای نام گذاری و ایجاد پایگاه داده خود میتوانید به یکی از دوشکل بالا عمل نمایید.

برای نام گذاری برای مجموعه ها (collections) باید به یکی از دو روش زیر عمل نماییم:

1 -

collection = db.test_collection


2 -

collection = db['test-collection']


برای ورود اطلاعات یا همان insert سند داخل مجموعه(collection) از متد insert() استفاده کنید:

Example = collection.insert(dictionary)  یک دیکشنری از اطلاعات پاس میدهیم


پس از اولین ورود سند مجموعه بصورت حقیقی بر روی سرور ایجاد می‌شود.


برای آزمایش این موضوع میتوان از دستور زیر استفاده کرد:

>>>db.collection_names()
[u'system.indexes', u'collection']

جستوجوی بصورت تک:

collection.find_one(dictionary)

به محض مچ شدن اولین شرط، نتیجه را بر میگرداند.


Bulk Insert

در مبحث جدید بحث ورود داده بصورت توده های بزرگ که از همان مکانیزم مونگو برای ذخیره سازی های انبوه بصورت آرایه هست استفاده مینماید و این امر موجب سرعت سریع در ذخیره سازی شده است، زیرا که در این نوع ورود داده، دیگر داده‌ها از نظر صحت ورودشان در دیتابیس بررسی نشده و داده‌ها بصورت اتومیک ذخیره میگردند. دلیل اصلی سرعت بالا در این نوع ورود، محروم بودن از صحت درج داده می‌باشد. در مثال زیر آرایه ای از داده‌ها bulk می‌شوند:

collection.insert([dict1, dict2, dict3, ...])


استفاده از query

برای استفاده از query از متد
find()
استفاده مینماییم، بدین صورت که دیکشنری ایی را مبنی بر شرط مورد استفاده به متد مذکور پاس میدهیم.


collection.find(dict)

Indexing

برای اجرای سریع query ها باید به مجموعه(collection) ایندکس اعمال نماییم.

ایندکس ها بر دو اساس صعودی و نزولی قابل ایندکس گذاری هستند.

پس از اعمال ایندکس سرعت سرچ، اضافه و حذفو , ... بسیار سرعت این query ها افزایش یافته.

Collection.create_index([('key1', 1), ('key2', -1)])

مقدار ۱ یا ASCENDING صعودی می‌باشد و مقدار -۱ یا DESCENDING نزولی می‌باشد.

ابزارهای شخصی

گویش‌ها
فضاهای نام
عملکردها
گشتن
جعبه‌ابزار