تخطَّ إلى المحتوى

إضافة البيانات في MongoDB: insertOne و insertMany

الدرس 3 من 8 · MongoDB

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

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 بنفسك:

db.authors.insertOne({ _id: 'sara-ahmed', name: 'سارة أحمد', country: 'مصر' })
الناتج
{ acknowledged: true, insertedId: 'sara-ahmed' }

المعرّف هنا نص مقروء، وليس ObjectId. لكن عليك أن تضمن بنفسك أنه فريد.

ماذا لو أضفنا مؤلفاً آخر بنفس المعرّف؟

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 })

تذكّر من الدرس السابق: المستندات في نفس المجموعة قد تختلف حقولها:

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. هذا مفيد جداً في مرحلة تطوير التطبيقات، حيث تتغير البيانات كثيراً.

في التطبيقات الحقيقية، لا تكتب في mongosh، بل يضيف الكود البيانات عبر مكتبة الاتصال (Driver) الخاصة بلغتك. في Node.js مثلاً يبدو الكود متطابقاً تقريباً:

const result = await db.collection('books').insertOne({ title: 'كتاب جديد', year: 2026 });
console.log(result.insertedId);

لهذا يحب مطورو JavaScript قاعدة MongoDB: لغة الاستعلام نفسها هي كائنات JavaScript.

  1. أنشئ قاعدة school بـ use school.
  2. أضف طالباً واحداً بـ insertOne فيه: الاسم، والعمر، ومصفوفة مواد، وتاريخ التسجيل بـ new Date(). لاحظ insertedId.
  3. أضف 4 طلاب دفعة واحدة بـ insertMany.
  4. تحقق من العدد بـ countDocuments().
  5. أنشئ مجموعة teachers وضع لكل معلم _id مقروءاً من اختيارك، ثم جرّب إضافة معرّف مكرر ولاحظ الخطأ E11000.
  • نسيان القوسين المربعين في insertMany: insertMany({...}, {...}) خطأ. المستندات تُمرر كمصفوفة [{...}, {...}].
  • التاريخ كنص: addedAt: '2026-09-01' يُخزَّن نصاً، فتفشل المقارنات الزمنية. استخدم new Date(...).
  • أخطاء إملائية في اسم المجموعة: db.bookss.insertOne(...) ينشئ مجموعة جديدة بالاسم الخاطئ بصمت! راجع بـ show collections.

سؤال

ماذا تُرجع insertOne عند نجاحها؟

سؤال

ماذا يعني الخطأ E11000 في MongoDB؟

  • insertOne({...}) يضيف مستنداً، ويرد بـ acknowledged و insertedId.
  • insertMany([...]) يضيف عدة مستندات في رحلة واحدة، ويرد بـ insertedIds.
  • المجموعة وقاعدة البيانات تُنشآن تلقائياً عند أول إضافة.
  • يمكنك اختيار _id بنفسك بشرط أن يكون فريداً، والتكرار يعطي الخطأ E11000.
  • استخدم new Date() للتواريخ، وانتبه لأسماء المجموعات.