إضافة البيانات في MongoDB: insertOne و insertMany
قاعدة بيانات فارغة لا فائدة منها! في هذا الدرس سنملأ مكتبتنا بالكتب والمؤلفين. ستتعلم الأمرين الأساسيين للإضافة في MongoDB، وكيف تقرأ رد الخادم لتتأكد من نجاح العملية، وماذا يحدث عندما تحاول إضافة شيء موجود مسبقاً.
إضافة مستند واحد: insertOne
Section titled “إضافة مستند واحد: insertOne”use library
db.books.insertOne({ title: 'رحلة إلى القمر', author: 'سارة أحمد', year: 2020, pages: 180, price: 75.5, available: true, genres: ['خيال علمي', 'مغامرات'], publisher: { name: 'دار النور', country: 'مصر' }, addedAt: new Date('2026-09-01'), notes: null}){ acknowledged: true, insertedId: ObjectId('6af3b81b855b5f32ecccd48d')}db.books: مجموعة الكتب في القاعدة الحالية. وإن لم تكن موجودة، تُنشأ الآن تلقائياً.- المستند يُكتب كأنه كائن JavaScript: أسماء الحقول بلا علامات تنصيص، والنصوص بين علامات تنصيص.
new Date('2026-09-01'): ينشئ قيمة تاريخ حقيقية، وليس نصاً.
والرد:
acknowledged: true: الخادم استلم العملية وأكدها.insertedId: معرّف المستند الجديد، ولّده MongoDB تلقائياً. (عندك سيكون رقماً مختلفاً.)
تخيّل insertOne مثل إيداع طرد في مكتب البريد: تسلّم الطرد، فيعطيك الموظف إيصالاً فيه رقم الشحنة. هذا الرقم هو insertedId.
إضافة عدة مستندات: insertMany
Section titled “إضافة عدة مستندات: insertMany”db.books.insertMany([ { title: 'أسرار البحار', author: 'عمر خالد', year: 2018, pages: 240, price: 90, available: true, genres: ['علوم', 'مغامرات'], publisher: { name: 'دار المعرفة', country: 'الأردن' } }, { title: 'البرمجة للمبتدئين', author: 'منى علي', year: 2023, pages: 320, price: 120, available: false, genres: ['تقنية'], publisher: { name: 'دار النور', country: 'مصر' } }, { title: 'حكايات جدتي', author: 'ليلى حسن', year: 2015, pages: 96, price: 45, available: true, genres: ['قصص', 'أطفال'], publisher: { name: 'دار الأمل', country: 'المغرب' } }, { title: 'عالم الروبوتات', author: 'يوسف سمير', year: 2022, pages: 210, price: 150, available: true, genres: ['تقنية', 'علوم'], publisher: { name: 'دار المعرفة', country: 'الأردن' } }]){ acknowledged: true, insertedIds: { '0': ObjectId('6af3b81b855b5f32ecccd48e'), '1': ObjectId('6af3b81b855b5f32ecccd48f'), '2': ObjectId('6af3b81b855b5f32ecccd490'), '3': ObjectId('6af3b81b855b5f32ecccd491') }}insertMany تأخذ مصفوفة مستندات بين قوسين مربعين، وتُرجع معرّف كل مستند حسب ترتيبه. وهي أسرع بكثير من استدعاء insertOne أربع مرات، لأنها رحلة واحدة إلى الخادم.
لنتأكد من العدد:
db.books.countDocuments()الناتج: 5
اختيار _id بنفسك
Section titled “اختيار _id بنفسك”أحياناً يكون عندك معرّف طبيعي ومفهوم، مثل اسم مستخدم أو رمز منتج. يمكنك وضعه في _id بنفسك:
db.authors.insertOne({ _id: 'sara-ahmed', name: 'سارة أحمد', country: 'مصر' }){ acknowledged: true, insertedId: 'sara-ahmed' }المعرّف هنا نص مقروء، وليس ObjectId. لكن عليك أن تضمن بنفسك أنه فريد.
خطأ المفتاح المكرر
Section titled “خطأ المفتاح المكرر”ماذا لو أضفنا مؤلفاً آخر بنفس المعرّف؟
db.authors.insertOne({ _id: 'sara-ahmed', name: 'أخرى' })E11000 duplicate key error collection: library.authors index: _id_ dup key: { _id: "sara-ahmed" }رفض MongoDB الإضافة، لأن _id يجب أن يكون فريداً دائماً. والرمز E11000 هو رمز خطأ المفتاح المكرر في MongoDB، وستراه كثيراً. ونفس الحماية تعمل مع أي حقل تضع عليه فهرساً فريداً (Unique Index)، مثل البريد الإلكتروني للمستخدمين:
db.users.createIndex({ email: 1 }, { unique: true })المرونة عند الإضافة
Section titled “المرونة عند الإضافة”تذكّر من الدرس السابق: المستندات في نفس المجموعة قد تختلف حقولها:
db.authors.insertOne({ _id: 'omar-khaled', name: 'عمر خالد', website: 'example.com', awards: 2 })db.authors.find()[ { _id: 'sara-ahmed', name: 'سارة أحمد', country: 'مصر' }, { _id: 'omar-khaled', name: 'عمر خالد', website: 'example.com', awards: 2 }]لم نحتج لتعديل أي «جدول» قبل إضافة الحقلين الجديدين website و awards. هذا مفيد جداً في مرحلة تطوير التطبيقات، حيث تتغير البيانات كثيراً.
الإضافة من التطبيقات
Section titled “الإضافة من التطبيقات”في التطبيقات الحقيقية، لا تكتب في mongosh، بل يضيف الكود البيانات عبر مكتبة الاتصال (Driver) الخاصة بلغتك. في Node.js مثلاً يبدو الكود متطابقاً تقريباً:
const result = await db.collection('books').insertOne({ title: 'كتاب جديد', year: 2026 });console.log(result.insertedId);لهذا يحب مطورو JavaScript قاعدة MongoDB: لغة الاستعلام نفسها هي كائنات JavaScript.
جرّب بنفسك
Section titled “جرّب بنفسك”- أنشئ قاعدة
schoolبـuse school. - أضف طالباً واحداً بـ
insertOneفيه: الاسم، والعمر، ومصفوفة مواد، وتاريخ التسجيل بـnew Date(). لاحظinsertedId. - أضف 4 طلاب دفعة واحدة بـ
insertMany. - تحقق من العدد بـ
countDocuments(). - أنشئ مجموعة
teachersوضع لكل معلم_idمقروءاً من اختيارك، ثم جرّب إضافة معرّف مكرر ولاحظ الخطأE11000.
أخطاء شائعة
Section titled “أخطاء شائعة”- نسيان القوسين المربعين في insertMany:
insertMany({...}, {...})خطأ. المستندات تُمرر كمصفوفة[{...}, {...}]. - التاريخ كنص:
addedAt: '2026-09-01'يُخزَّن نصاً، فتفشل المقارنات الزمنية. استخدمnew Date(...). - أخطاء إملائية في اسم المجموعة:
db.bookss.insertOne(...)ينشئ مجموعة جديدة بالاسم الخاطئ بصمت! راجع بـshow collections.
اختبر نفسك
Section titled “اختبر نفسك”سؤال
ماذا تُرجع insertOne عند نجاحها؟
الرد يؤكد استلام العملية، ويعطيك _id المستند الجديد لتستخدمه لاحقاً.
سؤال
ماذا يعني الخطأ E11000 في MongoDB؟
E11000 هو خطأ المفتاح المكرر، ويظهر عند تكرار _id أو أي حقل عليه فهرس فريد.
الخلاصة
Section titled “الخلاصة”insertOne({...})يضيف مستنداً، ويرد بـacknowledgedوinsertedId.insertMany([...])يضيف عدة مستندات في رحلة واحدة، ويرد بـinsertedIds.- المجموعة وقاعدة البيانات تُنشآن تلقائياً عند أول إضافة.
- يمكنك اختيار
_idبنفسك بشرط أن يكون فريداً، والتكرار يعطي الخطأE11000. - استخدم
new Date()للتواريخ، وانتبه لأسماء المجموعات.