FA-TOOLS — Header Component
آموزش MongoDB با پایتون — pymongo

آموزش MongoDB با پایتون — PyMongo

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

💡 نقشه راه سریع: PyMongo در یک نگاه!

اینجا یه خلاصه جمع و جور از چیزهایی که قراره یاد بگیریم رو برات آوردم تا بدونی چه مسیری رو پیش رو داریم:


  • نصب و راه‌اندازی: PyMongo و MongoDB رو سریع نصب کن.
  • 🔌
    اتصال به دیتابیس: با چند خط کد به MongoDB وصل شو.
  • 📝
    عملیات CRUD: درج، خواندن، به‌روزرسانی و حذف داده‌ها.
  • ⚙️
    کوئری‌های پیشرفته: چطور داده‌های پیچیده رو فیلتر کنی.
  • 🚨
    عیب‌یابی: راه حل مشکلات رایج رو اینجا پیدا کن.

برای هر سوالی هم می‌تونی با ما تماس بگیری: 09202232789

MongoDB چیه و چرا برای پایتون‌کارها عالیه؟

آموزش MongoDB با پایتون — pymongo — تصویر 2

MongoDB یه دیتابیس NoSQL محبوب و متن‌باز هست که داده‌ها رو به جای جداول رابطه‌ای، به صورت سندهای JSON-like ذخیره می‌کنه. این یعنی چی؟ یعنی انعطاف‌پذیری فوق‌العاده بالا! دیگه لازم نیست نگران اسکیمای ثابت باشی؛ می‌تونی سندهایی با ساختارهای متفاوت رو تو یه کالکشن (مثل جدول در دیتابیس‌های رابطه‌ای) ذخیره کنی. برای پایتون‌کارها این یعنی یه سازگاری بی‌نظیر، چون پایتون هم با ساختارهای داده‌ای انعطاف‌پذیر مثل دیکشنری‌ها و لیست‌ها خیلی خوب کنار میاد. خلاصه، MongoDB و پایتون مثل رفیق‌های قدیمی کنار هم کار می‌کنن.

چرا PyMongo رو انتخاب کنیم؟

آموزش MongoDB با پایتون — pymongo — تصویر 3

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

شروع کار: نصب و راه‌اندازی MongoDB و PyMongo

برای اینکه بتونیم با PyMongo کار کنیم، اول باید خود MongoDB رو نصب و راه‌اندازی کنیم و بعدش PyMongo رو به پروژه پایتونمون اضافه کنیم.

نصب MongoDB

نصب MongoDB بسته به سیستم عاملت کمی فرق داره، ولی روی سایت رسمی MongoDB می‌تونی راهنمای کاملشو پیدا کنی. (توصیه می‌کنم حتماً از نسخه Community Server استفاده کنی که رایگانه). بعد از نصب، مطمئن شو که سرویس MongoDB در حال اجراست. معمولاً با اجرای دستور `mongod` در ترمینال می‌تونی اون رو راه‌اندازی کنی. اگه از داکر (Docker) استفاده می‌کنی، می‌تونی با یه دستور ساده MongoDB رو بالا بیاری:


docker run -d --name mongo-dev -p 27017:27017 mongo
    

این دستور یه کانتینر MongoDB رو روی پورت 27017 (پورت پیش‌فرض MongoDB) برات راه‌اندازی می‌کنه.

نصب PyMongo

نصب PyMongo خیلی ساده‌ست و با `pip` انجام میشه:


pip install pymongo
    

اگه می‌خوای یه نسخه قوی‌تر با پشتیبانی از C-extensions داشته باشی که سرعت بالاتری ارائه میده، می‌تونی `python-snappy` یا `py-snappy` رو هم نصب کنی، اما برای شروع `pymongo` کفایت می‌کنه.

اولین اتصال: وصل شدن به MongoDB با PyMongo

حالا که همه چی نصبه، وقتشه اولین اتصال رو برقرار کنیم. این قسمت واقعاً سادست.


from pymongo import MongoClient

# گام 1: ایجاد یک کلاینت MongoDB
# به صورت پیش‌فرض به آدرس localhost و پورت 27017 متصل می‌شود.
client = MongoClient('mongodb://localhost:27017/')

# گام 2: انتخاب یا ایجاد یک دیتابیس
# اگر دیتابیس 'mydb' وجود نداشته باشد، هنگام درج اولین داده، ایجاد می‌شود.
db = client.mydb

# گام 3: انتخاب یا ایجاد یک کالکشن (مثل جدول)
# اگر کالکشن 'users' وجود نداشته باشد، هنگام درج اولین داده، ایجاد می‌شود.
users_collection = db.users

# برای تست، می‌تونیم یه سند (document) ساده درج کنیم
user_data = {"name": "Ali", "age": 30, "city": "Tehran"}
result = users_collection.insert_one(user_data)
print(f"Document inserted with ID: {result.inserted_id}")

# فراموش نکن که اتصال رو ببندی، به خصوص در اپلیکیشن‌های بزرگ
client.close()
    

تو این مثال، `client.mydb` یه راه مختصر برای دسترسی به دیتابیس `mydb` هست. اگه اسم دیتابیست مثلاً `my-database` بود که حاوی کاراکتر‌های خاص (مثل خط تیره) بود، باید از `client[‘my-database’]` استفاده می‌کردی. همین قانون برای کالکشن‌ها هم صدق می‌کنه.

مدیریت داده‌ها: عملیات CRUD با PyMongo

قلب هر دیتابیسی، توانایی مدیریت داده‌هاست: ایجاد (Create)، خواندن (Read)، به‌روزرسانی (Update) و حذف (Delete) که بهش CRUD هم می‌گن. PyMongo برای هر کدوم از این‌ها توابع قدرتمندی داره.

1. درج داده (Create)

برای درج یه سند (Document)، از `insert_one()` استفاده می‌کنیم. اگه می‌خوای چندین سند رو همزمان اضافه کنی، `insert_many()` به کارت میاد. سندها هم در پایتون چیزی نیستن جز دیکشنری‌های پایتونی.


from pymongo import MongoClient

client = MongoClient('mongodb://localhost:27017/')
db = client.mydb
products_collection = db.products

# درج یک سند
product_one = {"name": "Laptop", "price": 1200, "category": "Electronics"}
result_one = products_collection.insert_one(product_one)
print(f"One product inserted with ID: {result_one.inserted_id}")

# درج چند سند
product_list = [
    {"name": "Keyboard", "price": 75, "category": "Electronics"},
    {"name": "Mouse", "price": 30, "category": "Electronics"},
    {"name": "Book", "price": 25, "category": "Books"}
]
result_many = products_collection.insert_many(product_list)
print(f"Multiple products inserted with IDs: {result_many.inserted_ids}")

client.close()
    

2. بازیابی داده (Read)

برای پیدا کردن داده‌ها از توابع `find_one()` و `find()` استفاده می‌کنیم. `find_one()` اولین سندی که با شرط مطابقت داشته باشه رو برمی‌گردونه، در حالی که `find()` یه Cursor برمی‌گردونه که می‌تونی روش iterate کنی تا همه سندهای منطبق رو ببینی.


from pymongo import MongoClient

client = MongoClient('mongodb://localhost:27017/')
db = client.mydb
products_collection = db.products

# پیدا کردن یک سند
laptop = products_collection.find_one({"name": "Laptop"})
print("Found laptop:", laptop)

# پیدا کردن همه محصولات در دسته 'Electronics'
print("Electronic products:")
electronics_products = products_collection.find({"category": "Electronics"})
for product in electronics_products:
    print(product)

# کوئری‌های پیشرفته‌تر: محصولات با قیمت بیشتر از 50 دلار
print("Products with price > 50:")
expensive_products = products_collection.find({"price": {"$gt": 50}})
for product in expensive_products:
    print(product)

client.close()
    

اینجا `”$gt”` یه اپراتور کوئری (query operator) در MongoDB هست که به معنی “بزرگتر از” (greater than)ه. برای آشنایی بیشتر با اپراتورها و کوئری‌های MongoDB می‌تونی یه سری به بخش اسنیپت‌های ما بزنی.

3. به‌روزرسانی داده (Update)

برای به‌روزرسانی داده‌ها از `update_one()` یا `update_many()` استفاده می‌کنیم. این توابع دو آرگومان اصلی می‌گیرن: اولی فیلتری برای انتخاب سند(ها) و دومی عملیات به‌روزرسانی که معمولاً با اپراتور `”$set”` انجام میشه.


from pymongo import MongoClient

client = MongoClient('mongodb://localhost:27017/')
db = client.mydb
products_collection = db.products

# به‌روزرسانی یک سند: قیمت لپ‌تاپ را تغییر می‌دهیم
query = {"name": "Laptop"}
new_values = {"$set": {"price": 1300, "description": "High-performance laptop"}}
result_update_one = products_collection.update_one(query, new_values)
print(f"Modified {result_update_one.modified_count} document(s).")

# به‌روزرسانی چند سند: همه محصولات با قیمت زیر 50 دلار را گران‌تر می‌کنیم!
query_many = {"price": {"$lt": 50}}
new_values_many = {"$inc": {"price": 10}} # $inc برای افزایش مقدار یک فیلد است
result_update_many = products_collection.update_many(query_many, new_values_many)
print(f"Modified {result_update_many.modified_count} multiple document(s).")

client.close()
    

4. حذف داده (Delete)

برای حذف یک یا چند سند، از `delete_one()` یا `delete_many()` استفاده می‌کنیم. حواست باشه، این عملیات برگشت‌ناپذیره!


from pymongo import MongoClient

client = MongoClient('mongodb://localhost:27017/')
db = client.mydb
products_collection = db.products

# حذف یک سند: محصول 'Book' را حذف می‌کنیم
query_delete_one = {"name": "Book"}
result_delete_one = products_collection.delete_one(query_delete_one)
print(f"Deleted {result_delete_one.deleted_count} document(s).")

# حذف چند سند: همه محصولاتی که قیمتشون زیر 40 دلاره رو حذف می‌کنیم
query_delete_many = {"price": {"$lt": 40}}
result_delete_many = products_collection.delete_many(query_delete_many)
print(f"Deleted {result_delete_many.deleted_count} multiple document(s).")

client.close()
    

عملیات پیشرفته‌تر با PyMongo

PyMongo فقط برای CRUD‌های ساده نیست. کلی ابزار قدرتمند دیگه هم داره که برای سناریوهای پیچیده‌تر به کارت میان.

1. فیلترها و کوئری‌های پیچیده

MongoDB یه زبان کوئری غنی داره که PyMongo هم به طور کامل ازش پشتیبانی می‌کنه. می‌تونی از اپراتورهایی مثل `”$lt”` (کمتر از)، `”$lte”` (کمتر یا مساوی)، `”$in”` (شامل یکی از مقادیر)، `”$and”`، `”$or”` و کلی اپراتور دیگه برای فیلتر کردن دقیق داده‌ها استفاده کنی.


from pymongo import MongoClient

client = MongoClient('mongodb://localhost:27017/')
db = client.mydb
products_collection = db.products

# مثال: محصولاتی که قیمتشان بین 100 تا 1000 دلار است و در دسته 'Electronics' هستند.
complex_query = {
    "$and": [
        {"price": {"$gt": 100, "$lt": 1000}},
        {"category": "Electronics"}
    ]
}
print("Complex query results:")
results = products_collection.find(complex_query)
for doc in results:
    print(doc)

client.close()
    

2. ایندکس‌گذاری (Indexing)

ایندکس‌ها برای افزایش سرعت کوئری‌ها حیاتی هستن، مخصوصاً وقتی با حجم زیادی از داده‌ها سروکار داری. PyMongo بهت اجازه میده به راحتی ایندکس ایجاد کنی.


from pymongo import MongoClient, ASCENDING, DESCENDING

client = MongoClient('mongodb://localhost:27017/')
db = client.mydb
products_collection = db.products

# ایجاد یک ایندکس صعودی روی فیلد 'price'
products_collection.create_index([("price", ASCENDING)])
print("Index created on 'price' field.")

# ایجاد یک ایندکس ترکیبی روی 'category' (صعودی) و 'name' (نزولی)
products_collection.create_index([("category", ASCENDING), ("name", DESCENDING)])
print("Compound index created on 'category' and 'name'.")

client.close()
    

3. تجمیع (Aggregation Framework)

Aggregation Framework در MongoDB یه ابزار فوق‌العاده قدرتمنده برای پردازش و تحلیل داده‌ها. می‌تونی با استفاده از pipeline‌های مختلف، داده‌ها رو گروه‌بندی کنی، فیلتر کنی، تغییر شکل بدی و محاسبات آماری انجام بدی.


from pymongo import MongoClient

client = MongoClient('mongodb://localhost:27017/')
db = client.mydb
products_collection = db.products

# مثال: محاسبه میانگین قیمت محصولات بر اساس دسته‌بندی
pipeline = [
    {"$group": {
        "_id": "$category",
        "average_price": {"$avg": "$price"},
        "total_products": {"$sum": 1}
    }},
    {"$sort": {"average_price": -1}} # -1 برای مرتب‌سازی نزولی
]

print("Aggregation results (Avg Price by Category):")
aggregation_results = products_collection.aggregate(pipeline)
for result in aggregation_results:
    print(result)

client.close()
    

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

مقایسه: PyMongo در برابر ORM‌ها (مثل MongoEngine)

شاید از خودت بپرسی که PyMongo با ORMهایی مثل MongoEngine چه فرقی داره؟ جوابش اینجاست:

ویژگی PyMongo
سطح انتزاع پایین (مستقیم با MongoDB تعامل می‌کند)
انعطاف‌پذیری بالا (دسترسی کامل به تمام ویژگی‌های MongoDB)
یادگیری مستلزم آشنایی با مفاهیم و کوئری‌های MongoDB
عملکرد بهینه (چون لایه اضافه‌ای ندارد)
استفاده در پروژه‌های بزرگ مناسب برای کنترل دقیق و بهینه‌سازی

PyMongo بهت کنترل کامل روی دیتابیس میده، اما باید با سینتکس کوئری‌های MongoDB آشنا باشی. ORMها مثل MongoEngine یه لایه انتزاعی اضافه می‌کنن که کار با مدل‌های داده‌ای رو شبیه به کار با آبجکت‌های پایتون می‌کنه و معمولاً برای توسعه سریع‌تر و کدنویسی شی‌ءگرا مناسب‌ترن. انتخاب بین این دو بستگی به نیاز پروژه و سطح کنترل مورد نظرت داره. گاهی اوقات، ترکیب این دو هم می‌تونه راه حل خوبی باشه.

بهترین شیوه‌ها و نکات مهم

برای اینکه پروژه‌ات با PyMongo بدون مشکل و به بهترین شکل کار کنه، چند تا نکته مهم هست که باید رعایت کنی:

  • همیشه اتصال رو ببند: بعد از اتمام کار با دیتابیس، حتماً با `client.close()` اتصال رو ببند. تو محیط‌های وب، استفاده از connection pool‌ها (مثل `Connection` در `pymongo`) برای مدیریت کارآمد اتصالات توصیه میشه.
  • مدیریت خطا: همیشه کدها رو با بلوک‌های `try-except` بنویس تا خطاهای مربوط به دیتابیس رو به درستی هندل کنی و اپلیکیشنت کرش نکنه.
  • امنیت: اطلاعات اتصال به دیتابیس (مثل نام کاربری و رمز عبور) رو هیچ‌وقت مستقیم تو کد ننویس. از متغیرهای محیطی یا فایل‌های تنظیمات امن استفاده کن.
  • بهینه‌سازی کوئری‌ها: از ایندکس‌ها به درستی استفاده کن و همیشه کوئری‌هات رو با `explain()` تست کن تا ببینی چقدر بهینه هستن.
  • پاک‌سازی داده‌ها: اگه نیاز به حذف دیتابیس یا کالکشن برای تست داری، می‌تونی از `db.drop_collection(‘نام_کالکشن’)` یا `client.drop_database(‘نام_دیتابیس’)` استفاده کنی. البته با احتیاط!

🚨 عیب‌یابی سریع: مشکلات رایج و راه‌حل‌ها

گاهی اوقات همه‌چی طبق انتظار پیش نمیره. اینجا چند تا مشکل رایج و راه‌حلشون رو برات آوردم:

⚙️ Troubleshooting Tips

  • `ServerSelectionTimeoutError`: نمی‌توان به MongoDB متصل شد.

    ✔️ راه‌حل: مطمئن شو که سرویس MongoDB (با `mongod` یا داکر) در حال اجراست و پورت 27017 بازه. فایروال سیستم رو هم چک کن.

  • `AuthenticationFailed`: خطای نام کاربری یا رمز عبور.

    ✔️ راه‌حل: اگه برای دیتابیست احراز هویت تنظیم کردی، مطمئن شو که نام کاربری و رمز عبور رو در URL اتصال `MongoClient` به درستی وارد کردی.

  • کندی کوئری‌ها (Slow Queries).

    ✔️ راه‌حل: ایندکس‌گذاری رو بررسی کن. روی فیلدهایی که زیاد فیلتر یا مرتب‌سازی می‌کنی، ایندکس بساز. از `explain()` برای تحلیل عملکرد کوئری‌هات استفاده کن.

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

برای یادگیری و استفاده از کدهای آماده برای توسعه وب، می‌تونی به اسنیپت‌های CSS، اسنیپت‌های JS و اسنیپت‌های HTML هم سر بزنی. حتی برای وردپرس‌کارها هم کلی ابزار و اسنیپت وردپرس داریم.

Table of Contents

آخرین نوشته‌ها