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

السؤال

نشر (معدل)

لدي نوعين من schema بشكل منفصل وحاولت الإشارة إلى واحدة منهما ضمن الأخرى كالتالي:

var authorSchema = new Schema({
    name: String,
    age: Number,
   
});

var  Author = mongoose.model('Auhor') 

var bookSchema = new Schema({
    title: String,
    writtenBy: Author,
});

ولكن لم أحصل على النتيجة الصحيحة، ماهي طريقة الإشارة إلى الschema ضمن أخرى؟ لكي أستطيع الوصول إلى الكاتب من خلال إجراء الاستعلام عن الكتب الموجودة بشكل مشابه للتالي:

book.writtenBy.name

 

تم التعديل في بواسطة Tamim Fahed

Recommended Posts

  • 0
نشر

يمكن الإشارة للمؤلف بتعريف الحقل writtenBy أن يكون له مرجعية بهذه الطريقة populate:

var bookSchema = new Schema({
    title: String,
    writtenBy: {type: mongoose.Schema.Types.ObjectId, ref: 'Author'},
});

طريقة أخرى بإدراج authorSchema مباشرة في الحقل (نفس المستند) المطلوب باتباع مفهوم  Subdocuments:

var bookSchema = new Schema({
    title: String,
    writtenBy: authorSchema ,
});

 

  • 0
نشر

كما وضح وائل في التعليق السابق أنه يمكنك تنفيذ ما تريده من خلال طريقتين سواء ال referencing أو ال subdocument  يفضل استخدام الطريقة الثانية لأنها تقوم بإدراج ال authorSchema مباشرة في ال bookSchema فالميزة هنا أنها تحفظ البيانات كاملة في مكان واحد فيساعد على زيادة الأداء وتقليل زمن ال query لأنها لن تبحث في عدة أماكن لذلك يكون من الأفضل استخدام الطريقة الثانية في حالة 

  • أن البينات في ال  subdocument ليست كبيرة 
  • في حالة أن البيانات لا يحدث لها تغيير كثيراً

وأيضاً هناك استخدامات تجعل من ال referencing أفضل

  • 0
نشر

يمكنك الاشارة الى مستند اخر باستخدام ObjectId

const bookSchema = new Schema({
    title: String,
    writtenBy: {
      type: mongoose.Schema.Types.ObjectId, 
      ref: 'Author'
    },
});

كما يمكنك الاشارة الى عدة مستندات بجعل الكاءن array يحتوي على مجموعة من الاشارات بافتراض مثلا أن المقال شارك في كتابته عدة كتاب 

const bookSchema = new Schema({
    title: String,
    writtenBy: [
      {
        type: mongoose.Schema.Types.ObjectId, 
        ref: 'Author'
      }
    ],
});

 

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...