الاتصال بقاعدة بيانات MongoDB عبر بايثون (PyMongo): إضافة وقراءة المستندات

دقائق القراءة: 6

الاتصال بقاعدة بيانات MongoDB عبر بايثون (PyMongo): إضافة وقراءة المستندات

عندما تبدأ بالانتقال من الجداول التقليدية إلى عالم قواعد البيانات غير العلائقية (NoSQL) للبيانات الضخمة: متى نستخدم MongoDB؟ ستكتشف أن MongoDB لا يتعامل مع الصفوف والأعمدة بالشكل الكلاسيكي، بل يعتمد على المستندات المرنة بصيغة شبيهة بـ JSON. هذه البنية تجعل النظام مناسباً جداً للتطبيقات التي تتغير حقولها باستمرار، مثل منصات التجارة الإلكترونية، سجلات المستخدمين، وأحداث التتبع القادمة من الأنظمة الرقمية الحديثة.

في هذا المقال سنشرح عملياً كيفية الاتصال بقاعدة MongoDB باستخدام مكتبة PyMongo في بايثون، ثم تنفيذ أهم عمليتين أساسيتين: إضافة المستندات وقراءتها. وسنربط ذلك بمنظور هندسة البيانات، لأن تخزين البيانات الخام وشبه المهيكلة يمثل جزءاً محورياً في أي خط أنابيب بيانات (ETL – Extract, Transform, Load) باستخدام بايثون.

لماذا تستخدم PyMongo مع MongoDB؟

مكتبة PyMongo هي الواجهة الرسمية تقريباً للتعامل مع MongoDB في بايثون. من خلالها يمكن تنفيذ الاتصال، الإدراج، القراءة، التحديث، الحذف، وإنشاء الفهارس بدون الحاجة إلى كتابة طبقات معقدة فوق قاعدة البيانات.

في سياق علوم البيانات، تظهر أهمية PyMongo عندما تحتاج إلى التقاط بيانات قادمة من API أو سجلات تطبيقات أو بيانات نصية غير منتظمة، ثم حفظها كما هي قبل المرور لاحقاً على خطوات التنظيف مثل اكتشاف ومعالجة القيم المفقودة (Missing Values) أو معالجة البيانات المكررة والمشوهة (Duplicates & Outliers) باستخدام بايثون.

تثبيت المكتبة وتجهيز بيئة العمل

قبل كتابة أي سطر برمجي، تأكد من تثبيت بايثون وتشغيل خادم MongoDB محلياً أو عبر خدمة سحابية. إذا كنت تبني بيئتك البرمجية من الصفر، فمن المفيد مراجعة إعداد مختبر البيانات: تثبيت بيئة Jupyter Notebook ومكتبات التحليل الأساسية لتجهيز بيئة تجريبية منظمة.

بعد ذلك ثبّت مكتبة pymongo عبر مدير الحزم:

pip install pymongo

فهم مكونات الاتصال

  • العميل MongoClient يمثل نقطة البداية للاتصال.
  • قاعدة البيانات database هي الحاوية المنطقية للمجموعات.
  • المجموعة collection تشبه الجدول تقريباً، لكنها تحتوي على مستندات مرنة البنية.
  • المستند document هو سجل واحد يتكون من أزواج مفتاح/قيمة.

الاتصال بقاعدة البيانات لأول مرة

لننشئ مثالاً عملياً على قاعدة بيانات اسمها company_data ومجموعة باسم employees. في MongoDB لا يلزم إنشاء القاعدة والمجموعة يدوياً دائماً، إذ يمكن أن يتم إنشاؤهما تلقائياً عند أول إدراج فعلي للبيانات.

from pymongo import MongoClient

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

db = client["company_data"]
collection = db["employees"]

print("Connected to MongoDB successfully")

في هذا المثال قمنا بإنشاء كائن اتصال باستخدام MongoClient، ثم حددنا قاعدة البيانات والمجموعة. هذا الأسلوب هو الأساس الذي ستعتمد عليه لاحقاً داخل خدمات Backend أو مهام الاستخراج والتحميل في بنى ETL.

إضافة مستند واحد باستخدام insert_one()

أبسط عملية كتابة في PyMongo هي إدراج مستند واحد. المستند عبارة عن قاموس dict في بايثون، ويمكن أن يحتوي على نصوص وأرقام وقوائم وكائنات متداخلة.

from pymongo import MongoClient

client = MongoClient("mongodb://localhost:27017/")
db = client["company_data"]
collection = db["employees"]

employee = {
    "name": "Ahmed Ali",
    "age": 29,
    "department": "Data Engineering",
    "skills": ["Python", "SQL", "MongoDB"],
    "salary": 9500
}

result = collection.insert_one(employee)

print("Inserted document ID:", result.inserted_id)

إذا لم تحدد الحقل _id بنفسك، فسيقوم MongoDB بإنشائه تلقائياً. هذا المعرف فريد لكل مستند، ويستخدم كثيراً في الربط والتتبع والاسترجاع الدقيق.

إضافة عدة مستندات دفعة واحدة باستخدام insert_many()

في سيناريوهات البيانات الحقيقية، من النادر أن تضيف سجلاً واحداً فقط. غالباً ستتعامل مع دفعات قادمة من ملفات أو خدمات خارجية، مثل عمليات استخراج البيانات (Extract): سحب ملايين السجلات من واجهات API وقواعد بيانات SQL. هنا تظهر فائدة insert_many().

from pymongo import MongoClient

client = MongoClient("mongodb://localhost:27017/")
db = client["company_data"]
collection = db["employees"]

employees = [
    {
        "name": "Sara Hassan",
        "age": 31,
        "department": "Analytics",
        "salary": 8700
    },
    {
        "name": "Omar Khaled",
        "age": 27,
        "department": "Machine Learning",
        "salary": 10200
    },
    {
        "name": "Mona Adel",
        "age": 35,
        "department": "BI",
        "salary": 11000
    }
]

result = collection.insert_many(employees)

print("Inserted IDs:", result.inserted_ids)

عند تصميم أنظمة إدخال كثيفة البيانات، يفضل إدراج المستندات على شكل دفعات عبر bulk inserts بدلاً من تنفيذ آلاف العمليات الفردية. هذا يقلل كلفة الاتصال بالشبكة ويحسن throughput داخل طبقة التخزين بشكل ملحوظ.

قراءة المستندات باستخدام find() و find_one()

بعد تخزين البيانات تأتي خطوة القراءة. الدالة find_one() تعيد أول مستند يطابق الشرط، بينما find() تعيد مؤشراً يمكن المرور عليه لاستخراج جميع النتائج.

قراءة أول مستند

from pymongo import MongoClient

client = MongoClient("mongodb://localhost:27017/")
db = client["company_data"]
collection = db["employees"]

document = collection.find_one()

print(document)

قراءة جميع المستندات

from pymongo import MongoClient

client = MongoClient("mongodb://localhost:27017/")
db = client["company_data"]
collection = db["employees"]

for document in collection.find():
    print(document)

لاحظ أن نتيجة find() ليست قائمة جاهزة، بل كائن قابل للتكرار. هذا مهم في التعامل مع مجموعات ضخمة لأنه يسمح بقراءة النتائج تدريجياً دون تحميل كل البيانات إلى الذاكرة دفعة واحدة.

تصفية القراءة بشروط محددة

غالباً لن تحتاج إلى قراءة كل شيء. في التطبيقات التحليلية نبحث عن شريحة معينة من البيانات، مثل موظفي قسم محدد أو سجلات ضمن نطاق زمني أو مستندات تتجاوز قيمة معينة. هذا يشبه منطق الفلترة المتقدمة (Filtering & Sorting): استخراج رؤى دقيقة من ملايين السجلات لكن داخل قاعدة MongoDB.

from pymongo import MongoClient

client = MongoClient("mongodb://localhost:27017/")
db = client["company_data"]
collection = db["employees"]

query = {"department": "Data Engineering"}

for document in collection.find(query):
    print(document)

ويمكن أيضاً استخدام معاملات مقارنة مثل أكبر من وأصغر من:

from pymongo import MongoClient

client = MongoClient("mongodb://localhost:27017/")
db = client["company_data"]
collection = db["employees"]

query = {"salary": {"$gt": 9000}}

for document in collection.find(query):
    print(document)

تحويل النتائج إلى شكل مناسب للتحليل

في مشاريع علوم البيانات، لا تتوقف الرحلة عند القراءة فقط. بعد جلب المستندات قد تحتاج إلى تحويلها إلى DataFrame لمتابعة التحليل باستخدام فهم DataFrame و Series، أو دمجها مع مصادر أخرى كما في دمج وتوحيد الجداول (Merge, Join, Concat) لبناء قاعدة بيانات تحليلية شاملة.

from pymongo import MongoClient
import pandas as pd

client = MongoClient("mongodb://localhost:27017/")
db = client["company_data"]
collection = db["employees"]

documents = list(collection.find({}, {"_id": 0}))
df = pd.DataFrame(documents)

print(df.head())

هنا استخدمنا projection لاستبعاد الحقل _id لأنه قد لا يكون ضرورياً أثناء بعض مراحل التحليل. ثم حولنا النتائج إلى إطار بيانات يصلح للتنظيف والتلخيص والنمذجة.

في بيئات البيانات الضخمة، من الأفضل استخدام MongoDB كمخزن مرحلي للبيانات الخام أو شبه المنظمة، ثم تمرير البيانات المنظفة إلى أنظمة تحليلية أو مستودعات بيانات أكثر ملاءمة للتقارير الثقيلة. هذه المقاربة تفصل بين طبقة ingestion وطبقة analytics وتقلل الضغط على قواعد التشغيل.

أفضل ممارسات مهمة في المشاريع الحقيقية

  • تحقق دائماً من صحة بنية المستند قبل الإدراج، خاصة عند استقبال بيانات خارجية.
  • استخدم أسماء حقول واضحة وثابتة لتقليل الفوضى داخل المجموعة الواحدة.
  • أنشئ فهارس indexes للحقول كثيرة الاستخدام في التصفية.
  • لا تجلب كل المستندات إلى الذاكرة إذا كان حجم البيانات كبيراً، بل اقرأ تدريجياً أو على دفعات.
  • افصل بيانات التشغيل اليومية عن البيانات التحليلية بعيدة المدى كلما كبر النظام.

خاتمة

الاتصال بقاعدة MongoDB عبر بايثون باستخدام PyMongo يعد خطوة أساسية لأي مطور أو مهندس بيانات يريد التعامل مع البيانات المرنة بكفاءة. تعلمنا كيف ننشئ الاتصال، نضيف مستنداً واحداً أو عدة مستندات، ثم نقرأ البيانات كاملة أو وفق شروط محددة، مع ربط ذلك بسياق هندسة البيانات الحديث.

إتقان هذه الأساسيات يفتح لك الباب لبناء أنظمة أكثر تقدماً، مثل مهام الإدخال المؤتمتة، خدمات ETL، ولوحات التحليل، وحتى الربط مع أدوات المعالجة الموزعة عندما تتضخم الأحجام. والقاعدة الذهبية هنا هي أن فهم طريقة تخزين المستندات وقراءتها بشكل صحيح يختصر كثيراً من مشكلات الأداء والتعقيد مستقبلاً.

2 comments

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *