اذهب إلى المحتوى

السؤال

نشر

أقوم باستخدام mongoose للتعامل مع mongodb في مشروعي، ولكن لاحظت أنه يتم إضافة الحقل الفريد إلى المستندات بشكل تلقائي وهو id_. ولكن قيمة طويلة وهي سلسلة من أحرف وأرقام.

كيف يمكنني إنشاء حقل فريد آخر عبارة عن أرقام فقط بحيث يبقى هذا الحقل فريد لكافة المستندات كما هو الحال في mySql؟

هل يوجد طريقة مثلى لتحقيق ذلك دون استخدام مكاتب خارجية أو التأثير على الأداء عند كل عملية إضافة على المجموعة؟

Recommended Posts

  • 0
نشر

يتطلب MongoDB الخاصية _id كمفتاح أساسي فريد يقوم بفهرسته تلقائيًا ولذلك امامك خياران لفعل ذلك

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

في الحقيقة يوجد مثال في التوثيق الرسمي ل mongodb عن كيفية تحقيق المطلوب و هو عن طريق انشاء counter collection

db.counters.insert(
   {
      _id: "userid",
      seq: 0
   }
)

قم بإنشاء دالة getNextSequence تقبل اسم التسلسل. تستخدم الدالة طريقة findAndModify لزيادة قيمة seq  وإرجاع هذه القيمة الجديدة:

function getNextSequence(name) {
   var ret = db.counters.findAndModify(
          {
            query: { _id: name },
            update: { $inc: { seq: 1 } },
            new: true
          }
   );

   return ret.seq;
}

ثم استخدم الوظيفة getNextSequence  أثناء الإدراج

db.users.insert(
   {
     _id: getNextSequence("userid"),
     name: "salah"
   }
)

db.users.insert(
   {
     _id: getNextSequence("userid"),
     name: "ahmed"
   }
)
db.users.find()
{
  _id : 1,
  name : "salah"
}
{
  _id : 2,
  name : "ahmed"
}

 

  • 0
نشر

يمكنك تعريف حقل _id يدويًا أثناء مرحلة المخطط Schema ، مثل:

const DocumentSchema = new Schema({
  _id: String // أو رقم أو دالة زيادة تدريجياً
  ...
})

لتجاوز _idحقل أو تعريفه يدويًا في المخطط ، استخدم هذا المثال:

/**
 * extends Document
 * هو عبارة عن
 * Mongoose Document
 * من
 * 'mongoose'
 */
@Schema()
export class Key extends Document { 
  @Prop()
  _id: string;

  @Prop({ required: true })
  secret: string;
}

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...