English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

سلسلة التدرج التلقائي في MongoDB

MongoDB لا يحتوي على وظيفة تلقائية لزيادة المفتاح كما في قواعد البيانات SQL. بشكل افتراضي، سيكون_idحقلObjectId من 12 بيت كود الميدان يستخدم كمفتاح رئيسي لتحديد الوثيقة بشكل فريد. ولكن، في بعض الحالات، قد نرغب في أن يكون حقل_id يحتوي على قيمة تلقائية تتدرج بخلاف ObjectId.

بما أن هذا ليس ميزة افتراضية في MongoDB،سنقوم بتحقيق ذلك من خلالcountersيقدم MongoDB مجموعة مقترحة للوصول إلى هذه الميزة برمجة.

استخدام مجموعة المحاكم

انظر أدناهproductsوثيقة.نريد أن يكون حقل _id سلسلة ذات أرقام متدرجة تتدرج من 1،2،3،4 إلى n.

{
  "_id":1,
  "product_name": "Apple iPhone"
  "category": "mobiles"
}

للقيام بذلك،أنشئcountersمجموعة،وسيتبع هذه المجموعة آخر قيمة لكل حقل تسلسلي.

>db.createCollection("counters")

الآن، سنقوم بإنشاء وثيقةproductidإدراج كлючه في مجموعة counters-

> db.counters.insert({
	"_id":"productid",
	"sequence_value": 0
})
WriteResult({ "nInserted" : 1 })
>

حقل sequence_value يتبع آخر قيمة في التسلسل.

استخدام الكود التالي لإدراج هذا الوثيقة التسلسلية في مجموعة counters-

>db.counters.insert({_id:"productid",sequence_value:0})

إنشاء دالة Javascript

الآن، سننشئ دالةgetNextSequenceValue،وسيستخدم هذا الدالة اسم التسلسل كمدخل،وسيضيف 1 إلى الرقم التسلسلي ويعيد الرقم التسلسلي المعدل.في مثالنا،اسم التسلسل هوproductid

>function getNextSequenceValue(sequenceName){
   var sequenceDocument = db.counters.findAndModify({
      query:{_id: sequenceName },
      update: {$inc:{sequence_value:1}},
      new:true
   });
   return sequenceDocument.sequence_value;
}

استخدام دالة Javascript

الآن، سنستخدم دالة getNextSequenceValue عند إنشاء وثيقة جديدة وتخصيص القيمة التسلسلية العائدة كحقل _id للوثيقة.

استخدام الكود التالي لدمج مستندين نموذجيين-

>db.products.insert({)
   "_id":getNextSequenceValue("productid"),
   "product_name":"Apple iPhone",
   "category":"mobiles"
})
>db.products.insert({)
   "_id":getNextSequenceValue("productid"),
   "product_name":"Samsung S3",
   "category":"mobiles"
})

كما ترون، قمنا باستخدام وظيفة getNextSequenceValue لضبط قيمة حقل _id.

لإثبات الوظيفة، دعنا نستخدم أمر find للحصول على المستندات

>db.products.find()

استعلام أعلاه عاد بالوثائق التالية التي تحتوي على حقل _id التلقائي

{ "_id" : 1, "product_name" : "Apple iPhone", "category" : "mobiles"}
{ "_id" : 2, "product_name" : "Samsung S3", "category" : "mobiles" }