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

إجراء اتصال بأكثر من قاعدة بيانات mongodb في mongoose

Tamim Fahed

السؤال

لدي مشروع رئيسي يتصل بقاعدة بيانات mongodb ولكن بضمنه أيضاً أقسام أخرى صغيرة تتعامل مع قواعد بيانات مستقلة عن بعضها.

ولكن المشكلة أن mongoose لا يسمح بإجراء أكثر من اتصال مع قواعد البيانات بما أن المودل مبني من خلال إنشاء غرض mongoose واحد. وأيضاً المشكلة الثانية أنه لا يمكنني إنشاء أكثر من نسخة من نفس الغرض mongoose ضمن node js.

لقد حاولت استخدام التوابع التالية عند إنشاء الاتصال في mongoose:

createConnection()

و

openSet()

ولكن لم يتم حل المشكلة.

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

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

بما أن الأقسام منفصلة عن بعضها وتتشارك نوعاً ما ببنية الكود من الممكن حدوث تضارب كبير في حال تم تجميع كل الـ schema لجميع قواعد البيانات التي لديك ضمن مكان واحد، وبذلك سيصبح المشروع معقّد جداً ولن تستطيع تمييز الخطأ عند حدوثه، لذلك في حال كان كل قسم يحوي مكتباته الخاصة أي ملف (package.json) يمكنك تحميل mongoose في هذه الأقسام بشكل منفصل والتعامل مع الاتصال وبنية schema لكل قاعدة بيانات على حدى.

وبالتالي يمكنك إنشاء module خاص بالاتصال ضمن كل قسم كالتالي (وليكن ملف اتصال القسم الأول sub_project1_connect.js):

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/sub_project1');
module.exports = exports = mongoose;

وهكذا لبقية الأقسام، ثم نقوم بإنشاء ملف واجهة interface لهذه الاتصالات بحيث يقوم بتجميعها لسهولة الوصول إليها لاحقاً:

var mongoose = require("./sub_project1_connect.js");

الآن يمكنك في أي مكان في الكود وضمن أي قسم من تضمين ملف الاتصال الموافق لقاعدة البيانات التي ترغب بالتعامل معها وسيتم بشكل تلقائي إنشاء نسخة mongoose من ذلك الاتصال وبالتالي تحصل على بنية أفضل للملفات وسهولة أكبر في التعامل المباشرة مع قواعد البيانات و ال schema الموجودة لديك.

أما في حال رغبت باستخدام التابع createConnection فيجب عليك عندها إنشاء model خاص بكل اتصال بالشكل التالي:

var first_con = mongoose.createConnection('mongodb://localhost/sub_project1');
var second_con = mongoose.createConnection('mongodb://localhost/sub_project2');

// قاعدة البيانات الأولى
var Model_project1    = first_con.model('Model', new mongoose.Schema({
  
....

}));

// قاعدة البيانات الثانية
var Model_project2    = second_con.model('Model', new mongoose.Schema({
  
...

}));

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

يمكنك استخدام 

mongoose.createConnection();

وبالتالي يمكنك وضع كل اتصال بمتغير بهذا الشكل 

const connectionOne = mongoose.createConnection("الاتصال بالسيرفر الأول");
const connectionTwo = mongoose.createConnection("الاتصال بالسيرفر الثاني");

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

يمكنك تقسيم المشاريع الى مجلدات فرعية, ثم تقوم بتثبيت mongoose في هذه المجلدات الفرعية وتطلب mongoose من المجلدات الخاصة في كل تطبيق فرعي وليس من جذر المشروع, لاحظ هذه الهيكيلة للملفات في المشروع

-appRoot/
--xApp/
---dbAccess.js
---x_db_connect.js
---node_modules/
----mongoose/
--yApp/
---dbAccess.js
---y_db_connect.js
---node_modules/
----mongoose/

في ملف x_db_connect.js تقوم بانشاء الاتصال كالتالي

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/x_db');
module.exports = exports = mongoose;

في ملف y_db_connect.js تقوم بانشاء الاتصال كالتالي

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/y_db');
module.exports = exports = mongoose;

في ملف dbAccess.js لمشروع x تقوم بالتالي

var mongoose = require("./x_db_connect.js");

في ملف dbAccess.js لمشروع y تقوم بالتالي

var mongoose = require("./y_db_connect.js");
 
رابط هذا التعليق
شارك على الشبكات الإجتماعية

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...