آموزش اتصال به mongodb با پایتون

امیرحسین بیگدلو 12 ماه قبل

# پایتون و "MonoDB": اتصال به پایگاه داده‌ی "NoSQL"

«مونگو‌دی‌دبی» یک راه‌حل پایگاه داده‌ی سند‌محور و "NoSQL" بوده که در کنار یک سامانه‌ی پرس‌وجوی قدرتمند، مقیاس‌پذیری و انعطاف پذیری زیادی را فراهم می‌کند. با MongoDB و پایتون، می‌توانید انواع مختلفی از برنامه‌های مبتنی بر پایگاه‌ داده را به سرعت توسعه دهید. بنابراین اگر برنامه‌ی پایتون شما نیاز به پایگاه‌ داده‌ای دارد که به اندازه خود زبان انعطاف‌پذیر باشد، MongoDB به کارتان می‌آید.

 

در طی این برنامه آموزشی چند مثال خواهید نوشت که انعطاف‌پذیری و قدرت "MongoDB" و پشتیبانی بزرگ پایتون برایش را نشان خواهند داد.

 

دوره پیشنهادی: دوره آموزش MongoDB

 

# استفاده‌ی پایگاه‌های داده‌ی"SQL" در مقابل "NoSQL"

برای چند دهه، پایگاه‌ داده‌های "SQL" یکی از محدود انتخاب‌هایی بودند که توسعه‌دهندگان به دنبال ایجاد سیستم‌های پایگاه‌ داده‌ای بزرگ و مقیاس‌پذیر داشتند. با این حال، نیاز فزاینده به ذخیره‌سازی ساختارهای داده‌ای پیچیده منجر به ظهور پایگاه‌های داده "NoSQL" شده‌ است. این نوع جدید از سیستم پایگاه‌ داده به توسعه‌دهندگان اجازه می‌دهد تا داده‌های ناهمگن و بی‌ساختار را به شکلی موثر ذخیره کنند. به طور کلی، سیستم‌های پایگاه‌ داده‌ای "NoSQL" ذخیره و بازیابی داده‌ها را به روشی کاملا متفاوت از سیستم‌های مدیریت پایگاه داده‌ی رابطه‌ای "SQL" یا همان (RDBMS) انجام می‌دهد.

 

زمانی که باید از بین فن‌آوری‌های پایگاه داده‌ی موجود یکی را انتخاب کنید، احتمالاً این انتخاب بین دو گزینه‌ی سیستم‌های "SQL" و "NoSQL" محدود می‌گردد. هر دوی آن‌ها دارای ویژگی‌های خاصی هستند که باید هنگام انتخاب هرکدام آن را مد نظر قرار دهید.

 
هنگام انتخاب یک پایگاه‌داده باید نقاط قوت و ضعفش را به دقت مد نظر قرار دهید. همچنین باید در نظر بگیرید که پایگاه‌ داده چگونه با سناریوی خاص مد نظر شما و الزامات برنامه‌تان متناسب است. گاهی راه‌حل مناسب استفاده‌ی ترکیبی از "SQL" و "NoSQL" برای مدیریت جنبه‌های مختلف یک سیستم وسیع‌تر است.
 
 
چند نمونه‌ی متداول از پایگاه‌ داده‌های "SQL" موارد زیر هستند:

 

مثال‌های پایگاه داده‌ی "NoSQL" این مواردند:

  • DynamoDB
  • Cassandra
  • Redis
  • CouchDB
  • RethinkDB
  • RavenDB
  • MongoDB

 

 

در سال‌های اخیر، پایگاه‌های داده "SQL" و "NoSQL" حتی شروع به ادغام کرده‌اند. به عنوان مثال، سیستم‌های پایگاه داده مانند "PostgreSQL"، "MySQL" و "Microsoft SQL Server" اکنون از ذخیره و جستجوی داده‌های «json» پشتیبانی می‌کنند، دقیقاً مثل پایگاه داده‌های "NoSQL". با این کار، می‌توانید با هردو فن‌آوری‌ به بسیاری از نتایج مشابه دست یابید. اما هنوز بسیاری از ویژگی‌های "NoSQL" مانند مقیاس‌بندی افقی و رابط کاربرپسند را به دست نمی‌آورید.

 

با این پیش زمینه‌ی مختصر درباره‌ی پایگاه داده‌های "SQL" و "NoSQL"، می‌توانید روی موضوع اصلی این برنامه آموزشی یعنی پایگاه داده "MongoDB" و نحوه‌ی استفاده‌ی از آن در پایتون، تمرکز کنید.

 

مقاله پیشنهادی: داکر چیست و چطور آن را با پایتون به کار ببریم؟

 

# مدیریت پایگاه‌داده "NoSQL" با کمک "MongoDB"

«مونگو‌دی‌بی» پایگاه داده‌ای سندمحور یوده که جزو "NoSQL" ها طبقه‌بندی می‌شود. در سال‌های اخیر در سراسر این حوزه محبوب شده‌است و به خوبی با پایتون ادغام می‌گردد. برخلاف "SQL RDBMS"های سنتی، "MongoDB" برای سازماندهی و ذخیره داده‌ها از مجموعه اسناد استفاده می‌کند. "MongoDB" داده‌ها را در اسناد بی‌الگو و انعطاف‌پذیرِ «شبهِ جی‌سون» ذخیره می‌کند. در اینجا، بی‌الگو به این معنی است که می توانید اسنادی با مجموعه‌ای از زمینه‌های متفاوت را در همان مجموعه داشته باشید، بدون نیاز به برآوردن یک طرح جدول پیچیده.

 

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

 

نکته: "JSON" مخفف عبارت JavaScript Object Notation است. این یک قالب فایل با ساختاری قابل خواندن برای انسانیِ متشکل از جفت‌های کلید-مقدار است که به شکل قراردای در عمق قرار می‌گیرند.

 

«مونگودی‌بی» به زبان "C++" نوشته شده و به طور فعال توسط شرکت "MongoDB Inc" توسعه یافته است. این برنامه در همه سیستم عامل های بزرگ مانند macOS، Windows، Solaris و اکثر توزیع‌های لینوکس اجرا می‌شود. به طور کلی سه هدف اصلی توسعه پشت پایگاه‌ داده‌های "MongoDB" وجود دارد:

 

۱. توزیع خوب

۲. ذخیره‌ی ساختارهای غنی داده

۳. ارائه‌ی مکانیزم جستجوی پیشرفته

 

در اصل "MongoDB" یک پایگاه داده توزیع شده است، بنابراین دسترسی بالا، درجه‌بندی افقی و توزیع جغرافیایی در سیستم تعبیه شده است. این پایگاه، داده‌ها را در اسنادی انعطاف‌پذیر مانند "JSON" ذخیره می کند. می‌توانید برای نگاشتِ اشیا موجود در برنامه‌های خود، این اسناد را مدلسازی کنید، که امکان کار موثر با داده‌هایتان را فراهم می‌کند.

 

«مونگو‌دی‌بی» یک زبان پرسشی قدرتمند ارائه می‌دهد که از جستجوی تک‌کاره، نمایه سازی، تجمیع، جستجوی مکانی، جستجوی متنی و موارد بسیارِ دیگر پشتیبانی می‌کند. در واقع جعبه‌ابزاری قدرتمند جهت دسترسی و کار با داده‌های شما ارائه می‌دهد. نهایتاً، "MongoDB" به طور رایگان در دسترس بوده و پشتیبانی کامل پایتون را دارد.

 

دوره پیشنهادی: دوره آموزش پایتون (python)

# مروری بر ویژگی‌های "MongoDB"

تا اینجا، یاد گرفتید که "MongoDB" چیست و اهداف اصلی آن کدامند. در این بخش، با برخی از ویژگی‌های مهم آن آشنا خواهید شد. برای سمت مدیریت پایگاه داده، "MongoDB" ویژگی‌های زیر را ارائه می‌دهد:

 

- پشتیبانی از «کوئری»: می‌توانید از انواع «کوئری»‌های استاندارد نظیر، تطابق (==)، مقایسه (< , >)، و عبارت‌های باقاعده استفاده کنید.

- محل ذخیره‌ی داده: می‌توانید به شکل مجازی هر نوع داده‌ای را ذخیره کنید، با ساختار، نیمه ساختار، حتی چند شکل.

- توسعه پذیری: با افزودن ماشین‌های بیشتری به خوشه‌ی سرور، کوئری‌های بیشتری را کنترل می‌کند.

- انعطاف پذیری و سرعت: می توانید برنامه‌ها را به سرعت با آن توسعه دهید.

- جهت‌یابی سند و بی الگو بودن: می‌توانید تمام اطلاعات مربوط به یک مدل داده را در سندی واحد ذخیره کنید.

- شِمای قابل‌تنظیم: می‌توانید طرح پایگاه داده را در حین پرواز تغییر دهید، که این باعث کاهش زمان لازم برای ارائه‌ی ویژگی‌های جدید یا رفع مشکلات موجود می شود.

- قابلیت‌های پایگاه‌ داده رابطه‌ای: می‌توانید اقدامات مشترکی نظیر نمایه‌سازی را در پایگاه‌های داده رابطه‌ای انجام دهید.

 

 

در رابطه با قسمت عملیات، "MongoDB" ابزار‌ها و ویژگی‌هایی ارائه می‌دهد که در سایر سیستم‌های پایگاه داده پیدا نخواهید کرد:

 

- مقیاس پذیری: چه به سرور مستقل و چه به خوشه‌های کامل سرورهای مستقل نیاز داشته باشید، می توانید "MongoDB" را در هر اندازه ای که لازم دارید مقیاس بندی کنید.

- پشتیبان تعادل-بار: "MongoDB" به طور خودکار داده‌ها را در میان قطعات مختلف جابجا می‌کند.

- پشتیبانی خودکار خرابی: اگر سرور اصلی شما خراب شود، نسخه اولیه‌ی جدید به طور خودکار فعال و راه‌اندازی می شود.

- ابزارهای مدیریت: می‌توانید ماشین‌های خود را با استفاده از سرویس مدیریت ابریِ MongoDB، ردیابی کنید.

- کارآمدی حافظه: به لطف فایل‌های نگاشت حافظه، MongoDB اغلب کارآمدتر از پایگاه‌های داده رابطه‌ای است.

 

 

تمام این ویژگی ها بسیار مفید هستند. به عنوان مثال، اگر از ویژگی نمایه‌سازی استفاده کنید، بسیاری از داده‌های شما برای بازیابی سریع در حافظه ذخیره می شوند. حتی بدون نمایه‌سازی کلیدهای سند خاص، MongoDB" با استفاده از تکنیک‌هایی که اخیراً استفاده شده است، داده‌های زیادی را در حافظه‌ی «کَش» ذخیره می‌کند.

 

مقاله پیشنهادی: 10 روش برای ریفکتور کردن کدهای پایتونی

# نصب و اجرای "MongoDB"

اکنون که با "MongoDB" آشنا شدید، وقت آن است که آستین‌ها را بالا زده و استفاده از آن را شروع کنید. اما ابتدا باید آن را بر روی دستگاه خود نصب کنید. سایت رسمی "MongoDB" دو نسخه از پایگاه داده را ارائه می‌دهد:

 

۱. نسخه انجمن، مدل سند انعطاف پذیر را به همراه «کوئری‌های اد هوک»، نمایه‌سازی و انباشتگی در زمان حقیقی ارائه می‌دهد تا روش‌های قدرتمندی برای دستیابی و تجزیه و تحلیل داده‌های شما فراهم کند. این نسخه به صورت رایگان در دسترس است.

 

۲. نسخه سازمانی، همان ویژگی‌های نسخه انجمن، به علاوه‌ی سایر ویژگی‌های پیشرفته‌ی مربوط به امنیت و نظارت را ارائه می‌دهد. این نسخه تجاری است، اما می توانید برای مدت زمان نامحدود جهت اهداف ارزیابی و توسعه از آن استفاده کنید.

 

 

# ساخت پایگاه داده‌ی MongoDB با استفاده از پوسته‌ی/«شِل» mongo

اگر دستورالعمل نصب و اجرا را دنبال کرده باشید، پس باید نمونه‌ای از "MongoDB" که روی سیستم شما در حال اجراست را داشته باشید. اکنون می توانید پایگاه داده‌های خود را ایجاد و آزمایش کنید. در این بخش، شما یاد خواهید گرفت که چگونه از پوسته‌ی mongo برای ایجاد، خواندن، به روزرسانی و حذف اسناد در پایگاه داده استفاده کنید.

 

+ اجرای پوسته‌ی mongo

پوسته‌ی mongo رابطی تعاملی بین "interactive JavaScript" و "MongoDB" است. می‌توانید از این ابزار برای پرس و جو و دستکاری داده‌های خود و نیز اجرای عملیات اجرایی استفاده کنید. از آنجا که این یک رابط جاوا اسکریپت است، از زبان آشنای "SQL" برای پرس و جوی پایگاه‌داده استفاده نخواهید کرد. در عوض از کد جاوا اسکریپت استفاده خواهید کرد.

 

برای اجرای پوستهی "mongo"، «ترمینال» یا «کامند لاین» خود را باز کرده و فرمان زیر را اجرا کنید:

$ mongo

 

این فرمان شما را به پوسته‌ی "mongo" می‌برد. در این مرحله، احتمالا دسته‌ای از پیام‌ها را با اطلاعاتی در مورد نسخه‌ی پوسته و آدرس سرور و «پورت» خواهید دید. در نهایت، برای وارد کردن پرس‌وجوها/«کوئری‌ها» و دستورات، «شِل پرامپت» برایتان باز خواهد شد.

 

می‌توانید آدرس پایگاه داده را به عنوان متغیر به دستور "mongo" منتقل کنید. همچنین می‌توانید از چندین گزینه مانند تعیین میزبان و پورت برای دسترسی به یک پایگاه داده از راه دور و غیره استفاده کنید. برای گرفتن جزئیات بیشتر در مورد نحوه استفاده از دستور mongo، می‌توانید راهنما را با کد زیر اجرا کنید:

mongo --help

 

 

+ برقراری اتصال

وقتی دستور "mongo" را بدون متغیر اجرا می‌کنید، پوسته را اجرا کرده و به سرور پیش‌فرض محلی که به وسیله‌ی پردازش "mongo" در آدرس mongod://127.0.0.1:27017 قرار دارد منتقل می‌شوید. این به آن معنی است که به میزبان/«هاست» محلی از طریق پورت ۲۷۰۱۷ متصل شده‌اید. به طور پیش‌فرض پوسته‌ی "mongo" نشست را با ایجاد اتصال به پایگاه داده‌ای آزمایشی آغاز می‌کند. می‌توانید از طریق شئ/«آبجکت» db به پایگاه داده‌ی ایجاد شده دسترسی داشته باشید.

> db
test
>

 

در این حالت، db پایگاه‌داده پیش‌فرض را به عنوان مرجعی برای تست نگه می‌دارد. برای تغییر پایگاه‌های داده، استفاده از دستور و نام پایگاه‌داده را به عنوان یک متغیر ارائه دهید.

 

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

> use rptutorials
switched to db rptutorials

 

این فرمان اتصال شما را به پایگاه داده "rptutorials" تغییر می دهد. تا زمانی که داده های واقعی را در پایگاه داده وارد نکنید، "MongoDB" پوشه‌ی پایگاه داده فیزیکی را در سیستم فایل ایجاد نمی‌کند. پس در این حالت، "rptutorials" در لیست پایگاه داده‌ی فعلی شما نشان داده نمی‌شود.

> show dbs
admin          0.000GB
config         0.000GB
local          0.000GB
>

 

پوسته‌ی "mongo" ویژگی‌ها و گزینه‌های زیادی را فراهم می کند. به شما امکان می دهد داده‌های خود را جستجو و دستکاری کرده و همچنین خود سرور پایگاه داده را مدیریت کنید.

 

پوسته‌ی "mongo" به جای استفاده از یک زبان پرس و جوی استاندارد مانند SQL، از زبان برنامه نویسی جاوااسکریپت و یک "API" کاربر پسند استفاده می‌کند. این "API" به شما امکان می‌دهد با داده‌های خود، که موضوع بخش بعدی است، بازی کنید.

 

دوره پیشنهادی: دوره آموزش الگوریتم‌نویسی در پایتون

 

+ ایجاد مجموعه ها و اسناد

پایگاه داده "MongoDB" یک مخزنِ فیزیکی برای مجموعه اسناد است. هر پایگاه داده مجموعه پرونده‌های خاص خود را در سیستم فایل دریافت می کند. این پرونده‌ها به وسیله‌ی سرور "MongoDB" که می توانند چندین پایگاه داده را مدیریت کنند، مدیریت می‌شوند.

 

در "MongoDB" مجموعه‌، گروهی از اسناد است. مجموعه‌ها تا حدی شبیه به متغیر‌های جداول در یک "RDBMS" سنتی، اما بدون تحمیل یک طرح سخت، هستند. از نظر تئوری، هر سند در یک مجموعه می‌تواند ساختار یا حوزه‌ای کاملا متفاوتی داشته باشد.

 

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

 

اجازه دادن به ساختارهای مختلف سند یکی از ویژگی‌های اصلی مجموعه‌های "MongoDB" است. این ویژگی انعطاف پذیری را فراهم کرده و بدون نیاز به تغییر شِمای جدول رسمی، زمینه های جدیدی را به اسناد اضافه می کند.

 

برای ایجاد یک مجموعه با استفاده از پوسته‌ی "mongo"، باید "db" را به پایگاه داده هدف خود هدایت کرده و سپس مجموعه‌ها را با استفاده از نشان‌گذاری ایجاد کنید:

> use rptutorials
switched to db rptutorials
> db
rptutorials
> db.tutorial
rptutorials.tutorial

 

در این مثال، شما از نشان‌گذاری نقطه‌ای جهت ایجاد آموزش به عنوان مجموعه ای در "rptutorials"، که پایگاه داده فعلی شماست، استفاده می کنید. توجه به این نکته مهم است که "MongoDB" پایگاه داده و مجموعه‌ها را به کندی ایجاد می‌کند. به عبارت دیگر، آنها فقط پس از وارد کردن سند اول به شکل فیزیکی ایجاد می‌شوند.

 

هنگامی که یک پایگاه داده و یک مجموعه دارید، می توانید اسناد را وارد کنید. اسناد در ""MongoDB، واحد ذخیره‌سازی هستند. در "RDBMS"، این معادل ردیف در جدول است. اما، اسناد "MongoDB" از سطرها بسیار متنوع‌تر هستند زیرا می‌توانند اطلاعات پیچیده‌ای مانند آرایه‌ها، اسناد تعبیه شده و حتی آرایه‌ای از اسناد را ذخیره کنند.

 

«مونگو‌دی‌بی» اسناد را در قالبی به نام Binary JSON (BSON) ذخیره کرده که نمایشی/(تمثالی) دودویی از «جی‌سون» است. اسناد "MongoDB" از جفت‌های زمینه/«فیلد» و مقدار تشکیل شده و ساختار زیر را دارند:

{
   field1 → value1,
   field2 → value2,
   field3 → value3,
   ...
   fieldN → valueN
}

 

مقدار یک «فیلد» می‌تواند هر نوع داده‌ای از نوعِ "BSON"، از جمله سایر اسناد، آرایه ها و آرایه های اسناد، باشد. در عمل، اسناد خود را با استفاده از قالب "JSON" مشخص خواهید کرد.

 

هنگامی که در حال ساخت برنامه‌ای مبتنی بر پایگاه داده "MongoDB" هستید، اصلی‌ترین تصمیمتان احتمالاً در مورد ساختار اسناد خواهد بود. به عبارت دیگر، باید تصمیم بگیرید که اسنادتان دارای چه زمینه‌ها و مقادیری باشد.

 

اگر قصد ساخت آموزش‌هایی برای سایت پایتون خود را دارید، ساختار اسناد شما احتمالاً به این شکل خواهد بود:

{
    "title": "Reading and Writing CSV Files in Python",
    "author": "Jon",
    "contributors": [
        "Aldren",
        "Geir Arne",
        "Joanna",
        "Jason"
    ],
    "url": "https://realpython.com/python-csv/"
}

 

سند اساسا مجموعه‌ای از نام‌های دارایی و ارزش‌های آن‌ها است. این مقادیر می‌تواند انواع داده‌های ساده مانند رشته‌ها و اعداد باشد، اما آن‌ها هم چنین می‌توانند متغیرهایی مثل کمک‌کنندگان در مثال بالا باشند.

 

مدل داده‌ی سند محورِ MongoDB به طور طبیعی داده‌های پیچیده را به عنوان یک شی واحد نشان می‌دهد. این به شما امکان می‌دهد بدون نیاز به دیدن چندین مکان یا جدول، به طور کلی با اشیاء داده کار کنید.  

 

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

 

 

+ کار با مجموعه و اسناد

تا اینجا، شما اصول نحوه‌ی اجرا و استفاده از پوسته‌ی mongo را می‌دانید. همچنین می‌دانید که چگونه اسناد خود را با استفاده از قالب JSON ایجاد کنید. اکنون وقت آن است که یاد بگیرید چگونه اسناد را در پایگاه داده‌ی MongoDB خود وارد کنید.

 

برای اضافه کردن سندی به یک پایگاه‌داده با استفاده از پوسته mongo، ابتدا باید مجموعه‌ای انتخاب کرده و سپس دستور .insertone () را روی مجموعه فراخوانی کرده و سند خود را یک متغیر در نظر بگیرید:

> use rptutorials
switched to db rptutorials

> db.tutorial.insertOne({
...     "title": "Reading and Writing CSV Files in Python",
...     "author": "Jon",
...     "contributors": [
...         "Aldren",
...         "Geir Arne",
...         "Joanna",
...         "Jason"
...     ],
...     "url": "https://realpython.com/python-csv/"
... })
{
    "acknowledged" : true,
    "insertedId" : ObjectId("600747355e6ea8d224f754ba")
}

 

با اولین دستور، به پایگاه داده‌ای که می‌خواهید استفاده کنید می‌روید. دستور دوم فراخوانی به روش «جاوا اسکریپت» است که یک سند ساده را در مجموعه انتخاب شده، آموزش، قرار می‌دهد. هنگامی که کلید «اینتر» را فشار دهید، روی صفحه‌ی خود پیامی دریافت می‌کنید که به شما در مورد سند تازه وارد شده و "insertedId" آن اطلاع رسانی می‌کند.

 

همانطور که پایگاه‌های داده رابطه‌ای برای شناسایی منحصر به فرد هر سطر در یک جدول، به یک کلید اصلی نیاز دارند، اسناد MongoDB نیز باید یک قسمت _id داشته باشند که به طور منحصر به‌فرد سند را شناسایی کند. MongoDB به شما امکان می‌دهد که شناسه‌ای دلخواه وارد کنید، به شرطی که منحصر به فرد بودن آن را تضمین کنید. با این حال، عمل کاملاً رایج این است که به MongoDB اجازه دهید به طور خودکار برایتان یک _id درج کند.

 

به همین ترتیب، با استفاده از دستور .insertMany () می‌توانید همزمان چندین سند را اضافه کنید:

> tutorial1 = {
...     "title": "How to Iterate Through a Dictionary in Python",
...     "author": "Leodanis",
...     "contributors": [
...         "Aldren",
...         "Jim",
...         "Joanna"
...     ],
...     "url": "https://realpython.com/iterate-through-dictionary-python/"
... }

> tutorial2 = {
...      "title": "Python 3's f-Strings: An Improved String Formatting Syntax",
...      "author": "Joanna",
...      "contributors": [
...          "Adriana",
...          "David",
...          "Dan",
...          "Jim",
...          "Pavel"
...      ],
...      "url": "https://realpython.com/python-f-strings/"
... }

> db.tutorial.insertMany([tutorial1, tutorial2])
{
    "acknowledged" : true,
    "insertedIds" : [
        ObjectId("60074ff05e6ea8d224f754bb"),
        ObjectId("60074ff05e6ea8d224f754bc")
    ]
}

 

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

 

پوسته mongo نیز چنین روش‌هایی را جهت انجام عملیات خواندن، به‌روزرسانی و حذف در پایگاه داده فراهم می‌کند. به عنوان مثال، می‌توانید از .find () برای بازیابی اسناد موجود در یک مجموعه استفاده کنید:

> db.tutorial.find()
{ "_id" : ObjectId("600747355e6ea8d224f754ba"),
"title" : "Reading and Writing CSV Files in Python",
"author" : "Jon",
"contributors" : [ "Aldren", "Geir Arne", "Joanna", "Jason" ],
"url" : "https://realpython.com/python-csv/" }
    ...

> db.tutorial.find({author: "Joanna"})
{ "_id" : ObjectId("60074ff05e6ea8d224f754bc"),
"title" : "Python 3's f-Strings: An Improved String Formatting Syntax (Guide)",
"author" : "Joanna",
"contributors" : [ "Adriana", "David", "Dan", "Jim", "Pavel" ],
"url" : "https://realpython.com/python-f-strings/" }

 

اولین فراخوانی دستور .find () تمام اسناد موجود در مجموعه آموزش را بازیابی می‌کند. از طرف دیگر، فراخوان دومِ .find () آن دسته از آموزش‌هایی که نویسنده آنها «جوانا» است را بازیابی می‌کند.

 

با این دانش پیش‌زمینه‌ای درباره‌ی نحوه‌ی استفاده از MongoDB از طریق پوسته‌ی/«شِل» mongo، آماده‌ی استفاده از MongoDB با پایتون هستید. بخش‌های بعدی شما را از طریق گزینه‌های مختلفِ استفاده از پایگاه‌های داده‌ای MongoDB در برنامه‌های پایتون‌ خودتان راهنمایی خواهند کرد.

 

دوره پیشنهادی: دوره آموزش Multi Threading در پایتون

 

# استفاده از MongoDB به همراه پایتون و PyMongo

حالا که فهمیدید MongoDB چیست و چگونه باید پایگاه‌داده را با استفاده از پوسته mongo ایجاد و مدیریت کنید، می‌توانید شروع به استفاده از MongoDB کنید، اما این بار با پایتون. MongoDB یک گرداننده‌ی/«درایور» پایتون به نام PyMongo فراهم می‌کند.

 

در این بخش، چند مثال را مرور خواهید کرد که به شما کمک می‌کند تا نحوه‌ی استفاده از PyMongo برای ایجاد برنامه های پایگاه داده‌ی شخصی خودتان با MongoDB و پایتون را احساس کنید.

 

هر ماژول در PyMongo وظیفه‌ی مجموعه‌ای از عملیات را بر روی پایگاه داده دارد. حداقل برای کارهای زیر ماژول خواهید داشت:

- ایجاد اتصالات پایگاه‌ داده

- کار با پایگاه داده

- کار با مجموعه‌ها و اسناد

- دستکاری مکان‌نما/«کِرسر»

- کار با رمزنگاری داده‌ها

 

به طور کلی، PyMongo مجموعه‌ای غنی از ابزارهایی را ارائه می‌دهد که می‌توانید از آن جهت برقراری ارتباط با کارگزار/«سِرور» MongoDB استفاده کنید. این سیستم عملکردی برای پرس و جو، بازیابی نتایج، نوشتن و حذف داده‌ها و اجرای دستورات پایگاه‌داده فراهم می‌کند.

 

 

+ نصب PyMongo

برای شروع استفاده از PyMongo، ابتدا باید آن را در محیط پایتون خود نصب کنید. می‌توانید از محیط مجازی استفاده کرده، یا می‌توانید نصب از طریق پایتون بر روی کل سیستم را انتخاب کنید، اگر چه گزینه اول ترجیح داده می‌شود. PyMongo در PyPI موجود است، بنابراین سریع‌ترین راه برای نصب آن استفاده از «pip» است. ترمینال خود را اجرا کرده و فرمان زیر را در محیط «شِل» اجرا کنید:

$ pip install pymongo==3.11.2

 

پس از چند بارگیری و سایر مراحل مرتبط، این دستور، PyMongo را روی محیط پایتون شما نصب می‌کند. توجه داشته باشید که اگر شماره‌ی/«ورژن» نسخه خاصی را ارائه ندهید، «pip»، آخرین نسخه‌ی موجود را نصب می‌کند.

 

نکته: جهت راهنمای کامل نحوه‌ی نصب PyMongo، به صفحه‌ی نصب/ارتقاء در اسناد رسمیِ آن مراجعه کنید.

 

پس از اتمام نصب، می‌توانید نشست تعاملی پایتون را آغاز کرده و موارد زیر را وارد/«import» کنید:

>>> import pymongo

 

اگر این کد بدون ایجاد استثنا/"exception" در پوسته‌ی پایتون انجام شود، نصب شما درست بوده؛ در غیر این صورت، مراحل را دوباره با دقت انجام دهید.

دوره پیشنهادی: دوره آموزش shell scripting

 

+ برقراری ارتباط

برای برقراری ارتباط با یک پایگاه داده، باید نمونه‌ای از MongoClient ایجاد کنید. این کلاس یک مشتری برای نمونه یا سرور MongoDB فراهم می‌کند. هر شی-مشتری دارای یک مخزنِ اتصال داخلی بوده که به طور پیش فرض حداکثر صد اتصال به سرور را مدیریت و برقرار می‌کند.

 

به نشست تعاملی پایتون برگردید و MongoClient را از pymongo وارد/«import» کنید. سپس یک شی مشتری ایجاد کرده تا با نمونه‌ی MongoDB فعلی خود ارتباط برقرار کنید:

>>> from pymongo import MongoClient
>>> client = MongoClient()
>>> client
MongoClient(host=['localhost:27017'], ..., connect=True)

 

کد بالا، اتصالی با «هاست» (localhost) و پورت (27017) پیش‌فرض برقرار می‌کند. MongoClient مجموعه ای از متغیرها را دریافت می‌کند که به شما امکان می‌دهد «هاست» دلخواه، پورت و سایر پارامترها را تعیین کنید. به عنوان مثال، جهت تهیه‌ی «هاست» و درگاه سفارشی، می‌توانید از کد زیر استفاده کنید:

>>> client = MongoClient(host="localhost", port=27017)

 

این کار درصورت نیاز به ارائه میزبان و درگاهِ متفاوت با تنظیمات پیش‌فرض MongoDB، کارا است. همچنین می‌توانید از قالبِ MongoDB URI استفاده کنید:

>>> client = MongoClient("mongodb://localhost:27017")

 

تمام این نمونه‌های MongoClient همان تنظیم مشتری را برای اتصال نمونه‌ی MongoDB فعلی شما فراهم می‌کنند. اینکه از کدام یک استفاده کنید فقط به صراحت کدتان بستگی دارد.

 

هنگامی MongoClient را نمونه‌سازی کردید، می‌توانید از نمونه‌ی آن برای اشاره به اتصال به پایگاه‌داده مد نظرتان استفاده کنید، درست مانند کاری که در بالا با شئِ db پوسته‌ی mongo انجام دادید.

 

 

+ کار با پایگاه‌‌های داده، مجموعه‌ها و اسناد

هنگامی که نمونه‌ای متصل از MongoClient دارید، می‌توانید به هر پایگاه داده‌ای که به وسیله‌ی سرور مشخصی از MongoDB مدیریت شده، دسترسی پیدا کنید. برای تعریف این که از چه پایگاه داده‌ای می‌خواهید استفاده کنید، می‌توانید از نقطه‌گذاری استفاده کنید، درست مانند آنچه که در پوسته‌ی mongo انجام دادید:

>>> db = client.rptutorials
>>> db
Database(MongoClient(host=['localhost:27017'], ..., connect=True), 'rptutorials')

 

در این حالت، rptutorials نام پایگاه داده‌ای است که با آن کار خواهید کرد. اگر پایگاه داده وجود نداشته باشد، MongoDB آن را برایتان ایجاد می‌کند، اما فقط هنگامی که اولین عملیات را روی پایگاه داده انجام دهید.

 

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

>>> db = client["rptutorials"]

 

این عبارت زمانی مفید است که نام پایگاه داده شما شناسه‌ی معتبر پایتون نباشد. به عنوان مثال، اگر نام پایگاه داده شما rp-tutorials باشد، لازم است از دسترسی به سبک دیکشنری استفاده کنید.

 

نکته: هنگامی که از پوسته‌ی mongo استفاده می‌کنید، از طریق شی جهانی/«گلوبال» db به پایگاه داده دسترسی پیدا می‌کنید. هنگام استفاده از PyMongo، می‌توانید پایگاه داده را به متغیری به نام db اختصاص دهید تا نتیجه‌ای مشابه رخ دهد.

 

ذخیره داده‌ها در پایگاه داده‌ی خود با استفاده از PyMongo مشابه کاری است که با پوسته‌ی mongo در بخش‌های بالا انجام دادید. اما ابتدا باید اسناد خود را ایجاد کنید. در پایتون از دیکشنری جهت ایجاد اسناد استفاده می‌کنید:

>>> tutorial1 = {
...     "title": "Working With JSON Data in Python",
...     "author": "Lucas",
...     "contributors": [
...         "Aldren",
...         "Dan",
...         "Joanna"
...     ],
...     "url": "https://realpython.com/python-json/"
... }

 

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

>>> tutorial = db.tutorial
>>> tutorial
Collection(Database(..., connect=True), 'rptutorials'), 'tutorial')

 

در این حالت، آموزش نمونه‌ای از مجموعه بوده و نمایانگر مجموعه فیزیکی اسناد موجود در پایگاه داده‌ی شماست. می‌توانید اسناد را با فراخوانی دستور .insert_one () در قسمت آموزش و با قرار دادن یک سند به جای متغیر داخل ()، وارد کنید:

>>> result = tutorial.insert_one(tutorial1)
>>> result
<pymongo.results.InsertOneResult object at 0x7fa854f506c0>

>>> print(f"One tutorial: {result.inserted_id}")
One tutorial: 60084b7d87eb0fbf73dbf71d

 

در اینجا، دستور .insert_one ()، آموزش/«tutorial1» را گرفته آن را در مجموعه‌ی آموزش قرار داده و یک شی InsertOneResult را برمی‌گرداند. این شی بازخورد مربوط به سند درج شده را ارائه می‌دهد. توجه داشته باشید که از آنجا که MongoDB به شکلی پویا ObjectId را تولید می‌کند، خروجی شما با ObjectId نشان داده شده در بالا مطابقت ندارد.

 

اگر اسناد زیادی برای افزودن به پایگاه داده دارید، می‌توانید با استفاده از .insert_many () آنها را به صورت یکجا وارد کنید:

>>> tutorial2 = {
...     "title": "Python's Requests Library (Guide)",
...     "author": "Alex",
...     "contributors": [
...         "Aldren",
...         "Brad",
...         "Joanna"
...     ],
...     "url": "https://realpython.com/python-requests/"
... }

>>> tutorial3 = {
...     "title": "Object-Oriented Programming (OOP) in Python 3",
...     "author": "David",
...     "contributors": [
...         "Aldren",
...         "Joanna",
...         "Jacob"
...     ],
...     "url": "https://realpython.com/python3-object-oriented-programming/"
... }

>>> new_result = tutorial.insert_many([tutorial2, tutorial3])

>>> print(f"Multiple tutorials: {new_result.inserted_ids}")
Multiple tutorials: [
   ObjectId('6008511c87eb0fbf73dbf71e'),
   ObjectId('6008511c87eb0fbf73dbf71f')
]

 

این راهی سریع‌تر و راحت‌تر از فراخوانی چندباره‌ی دستور .insert_one () است. فراخوانی دستور .insert_many () تعداد زیادی سند را گرفته و آن‌‌ها را در مجموعه‌ی آموزش موجود در پایگاه داده‌ی rptutorials شما قرار می‌دهد. این روش نمونه ای از InsertManyResult را برمی‌گرداند که اطلاعات مربوط به اسناد درج شده را فراهم می‌کند.

 

برای بازیابی اسناد یک مجموعه، می توانید از دستور .find () استفاده کنید. بدون ورود متغیر، .find () یک شی مکان‌نما/«کرسر» را برمی‌گرداند که در صورت دریافت درخواست، اسناد موجود در مجموعه را باز می‌گرداند:

>>> import pprint

>>> for doc in tutorial.find():
...     pprint.pprint(doc)
...
{'_id': ObjectId('600747355e6ea8d224f754ba'),
 'author': 'Jon',
 'contributors': ['Aldren', 'Geir Arne', 'Joanna', 'Jason'],
 'title': 'Reading and Writing CSV Files in Python',
 'url': 'https://realpython.com/python-csv/'}
    ...
{'_id': ObjectId('6008511c87eb0fbf73dbf71f'),
 'author': 'David',
 'contributors': ['Aldren', 'Joanna', 'Jacob'],
 'title': 'Object-Oriented Programming (OOP) in Python 3',
 'url': 'https://realpython.com/python3-object-oriented-programming/'}

 

در اینجا، حلقه‌ای بر روی شئی که دستور .find () برگردانده، اجرا کرده و نتایج پی‌درپی را با استفاده از دستور "pprint.pprint ()" جهت ایجاد قالب خروجی کاربرپسند چاپ می‌کنید.

 

برای بازیابی یک سند نیز می‌توانید از دستور .find_one () استفاده کنید. در این حالت، می‌توانید از یک دیکشنری حاوی زمینه‌هایی برای انطباق استفاده کنید. به عنوان مثال، اگر می خواهید اولین آموزشی که «جان» ارائه داده را بازیابی کنید، می‌توانید کاری مثل این انجام دهید:

>>> import pprint

>>> jon_tutorial = tutorial.find_one({"author": "Jon"})

>>> pprint.pprint(jon_tutorial)
{'_id': ObjectId('600747355e6ea8d224f754ba'),
 'author': 'Jon',
 'contributors': ['Aldren', 'Geir Arne', 'Joanna', 'Jason'],
 'title': 'Reading and Writing CSV Files in Python',
 'url': 'https://realpython.com/python-csv/'}

 

توجه داشته باشید که ObjectId آموزش زیر کلید _id قرار داده می‌شود، که شناسه‌ی منحصر به فرد سندی است که وقتی در پایگاه داده‌ی خود سندی را وارد می‌کنید، MongoDB آن را به طور خودکار اضافه می کند.

 

«پای‌مونگو»/PyMongo همچنین روش‌هایی برای جایگزینی، به‌روزرسانی و حذف اسناد از یک پایگاه داده ارائه می‌دهد. در صورت تمایل به پرداختن عمیق‌تر به جزییات این ویژگی‌ها، نگاهی به اسناد مجموعه بیندازید.

 

 

+ بستن ارتباطات

ایجاد اتصال به پایگاه داده MongoDB معمولاً عملیاتی پرهزینه است. اگر برنامه‌ای دارید که به طور مداوم داده‌ها را در پایگاه داده‌ی MongoDB بازیابی و دستکاری می‌کند، احتمالا نمی‌خواهید در تمام مدت اتصال را باز و بسته کنید چون این کار ممکن است بر عملکرد برنامه‌ی شما تاثیر بگذارد.

 

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

>>> client.close()

 

وضعیت دیگر این است که برنامه‌ای داشته باشید که گهگاه از پایگاه داده‌ی MongoDB استفاده می‌کند. در این حالت، بهتر است اتصال را در صورت لزوم باز کرده و بلافاصله پس از استفاده، جهت پاک کردن منابع به دست آمده، آن را ببندید. رویکرد ثابت برای این مشکل استفاده از دستورِ «with» است. بله، MongoClient پروتکل مدیریت متنی را اجرا می‌کند:

>>> import pprint
>>> from pymongo import MongoClient

>>> with MongoClient() as client:
...     db = client.rptutorials
...     for doc in db.tutorial.find():
...         pprint.pprint(doc)
...
{'_id': ObjectId('600747355e6ea8d224f754ba'),
 'author': 'Jon',
 'contributors': ['Aldren', 'Geir Arne', 'Joanna', 'Jason'],
 'title': 'Reading and Writing CSV Files in Python',
 'url': 'https://realpython.com/python-csv/'}
    ...
{'_id': ObjectId('6008511c87eb0fbf73dbf71f'),
 'author': 'David',
 'contributors': ['Aldren', 'Joanna', 'Jacob'],
 'title': 'Object-Oriented Programming (OOP) in Python 3',
 'url': 'https://realpython.com/python3-object-oriented-programming/'}

 

 

 

# نتیجه‌گیری

اگر به دنبال راه‌حلی قوی، مقیاس‌پذیر و انعطاف‌پذیر برای مشکلات پایگاه داده هستید، احتمالاً MongoDB برایتان گزینه‌ی خوبی است. MongoDB یک پایگاه داده‌ی NoSQL بزرگ و محبوب با پشتیبانی وسیعِ پایتون است. با داشتن درک مناسب از نحوه‌ی دسترسی به MongoDB با پایتون، آماده خواهید بود تا برنامه های پایگاه داده‌ای را ایجاد کنید که به خوبی مقیاس‌بندی شده و عملکرد عالی را ارائه دهند.

 

با MongoDB، هم‌چنین می‌توانید از مزیت داشتن مدل داده‌‌ای قابل خواندن برای انسان و انعطاف‌پذیر برخوردار باشید، بنابراین می‌توانید به سرعت با تغییرات مورد نیاز سازگار شوید.

مطالب مشابه



مونگارد