সিঙ্গেল নোড.জেএস প্রকল্পে মঙ্গুজ এবং একাধিক ডাটাবেস


122

আমি একটি নোড.জেএস প্রকল্প করছি যার মধ্যে সাব-প্রকল্প রয়েছে। একটি উপ প্রকল্পে একটি মংডোব ডাটাবেস থাকবে এবং মোংজু ডিবি মোড়ানোর এবং অনুসন্ধানের জন্য ব্যবহৃত হবে। তবে সমস্যা হচ্ছে

  • মডেলগুলি একটি সংযোগের ভিত্তিতে তৈরি হওয়ায় মোঙ্গুজ একক মঙ্গু উদাহরণে একাধিক ডাটাবেস ব্যবহার করতে দেয় না।
  • একাধিক মঙ্গু দৃষ্টান্ত ব্যবহার করতে, নোড.জেএস একাধিক মডিউল দৃষ্টান্তের অনুমতি দেয় না কারণ এতে ক্যাচিং সিস্টেম রয়েছে require()। আমি নোড.জেএসগুলিতে মডিউল ক্যাচিং অক্ষম জানি but তবে আমি মনে করি এটি কেবল মঙ্গুজের জন্য প্রয়োজনীয় কারণ এটি ভাল সমাধান নয়।

    আমি ব্যবহার করার চেষ্টা করেছি createConnection()এবং openSet()নকুল মধ্যে, কিন্তু এটা সমাধান ছিল না।

    আমি সাব প্রকল্পে নতুন মঙ্গুসের দৃষ্টান্তটি পাঠাতে মঙ্গুজের উদাহরণটি ( http://blog.imaginea.com/deep-copy-in-javascript/ ) অনুলিপি করার চেষ্টা করেছি , তবে এটি নিক্ষেপ করছে RangeError: Maximum call stack size exceeded

আমি জানতে চাই যে এই সমস্যাটির জন্য কোনওভাবেই মঙ্গুজের সাথে কোনও একাধিক ডাটাবেস বা কোনও কার্যনির্বাহী ব্যবহার করা যায়? কারণ আমি মনে করি মঙ্গুজ বেশ সহজ এবং দ্রুত। বা সুপারিশ হিসাবে অন্য কোন মডিউল?

উত্তর:


37

আপনি যা করতে পারেন তা হ'ল প্রতিটি প্রকল্পের জন্য আপনার সাবফোল্ডার থাকতে পারে। সুতরাং, সেই সাবফোল্ডারগুলিতে মঙ্গুজ ইনস্টল করুন এবং প্রতিটি উপ অ্যাপ্লিকেশনগুলিতে নিজস্ব ফোল্ডারগুলি থেকে () মঙ্গুজ প্রয়োজন। প্রকল্পের মূল থেকে বা গ্লোবাল থেকে নয়। সুতরাং একটি উপ প্রকল্প, একটি মঙ্গুজ ইনস্টলেশন এবং একটি মঙ্গু উদাহরণ।

-app_root/
--foo_app/
---db_access.js
---foo_db_connect.js
---node_modules/
----mongoose/
--bar_app/
---db_access.js
---bar_db_connect.js
---node_modules/
----mongoose/

Foo_db_connect.js এ

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

বার_ডিবি_কনেক্ট.জেএস এ

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

Db_access.js ফাইলগুলিতে

var mongoose = require("./foo_db_connect.js"); // bar_db_connect.js for bar app

এখন, আপনি মঙ্গুজ সহ একাধিক ডাটাবেস অ্যাক্সেস করতে পারেন।


2
এর অর্থ প্রতিটি প্রকল্পের নিজস্ব সংযোগ থাকবে। আপনি 100 কে সংযোগ পরিচালনা করতে সক্ষম হবেন না। আমি মনে করি useDbযে একই সংযোগ পুল ব্যবহার করে কমান্ড ব্যবহার করা ভাল better
xpepermint

1
xpepermint আপনি useDb জন্য একটি উদাহরণ প্রদর্শন করতে পারবেন - আমি এই সমস্যা হচ্ছে না বর্তমানে stackoverflow.com/questions/37583198/...
Lion789

4
এটি প্রকল্পের উপর একটি বিশাল বোঝার মতো দেখায়। আপনি কি তাই মনে করেন না?
warশ্বর প্রসাদ যদ্দনপুদি

1
অ্যাপ্লিকেশনটির জন্য কয়েকটি পৃথক সংযোগের উদাহরণ (যেমন কোনও ব্যবহারকারী ডিবি, একটি সেশন ডিবি এবং অ্যাপ্লিকেশন ডেটার জন্য) থাকা একেবারে ঠিক। এটি 'বিশাল বোঝা' বা স্কেলিং সমস্যা তৈরির কারণ নয় এবং এটি সাধারণ ব্যবহারের ক্ষেত্রে।
আইয়েন কলিন্স

তুমি আমার সেরা বন্ধু! অনেক ধন্যবাদ! এটা আমার জন্য কাজ করে! ধন্যবাদ!
বিরুয়েল রিক

214

সূক্ষ্ম ম্যানুয়াল অনুসারে , একাধিক ডাটাবেসে সংযোগ করতে ব্যবহার করা createConnection() যেতে পারে।

তবে আপনাকে প্রতিটি সংযোগ / ডাটাবেসের জন্য পৃথক মডেল তৈরি করতে হবে:

var conn      = mongoose.createConnection('mongodb://localhost/testA');
var conn2     = mongoose.createConnection('mongodb://localhost/testB');

// stored in 'testA' database
var ModelA    = conn.model('Model', new mongoose.Schema({
  title : { type : String, default : 'model in testA database' }
}));

// stored in 'testB' database
var ModelB    = conn2.model('Model', new mongoose.Schema({
  title : { type : String, default : 'model in testB database' }
}));

আমি নিশ্চিত যে আপনি তাদের মধ্যে স্কিমা ভাগ করতে পারবেন, তবে আপনাকে অবশ্যই তা পরীক্ষা করতে হবে।


4
হ্যাঁ, নামযুক্ত সংযোগগুলি এবং একটি ভাগ করা স্কিমা হ'ল আমার মনে হয়। প্রতিটি সংযোগের রবার্টের উদাহরণ অনুসারে একটি অনন্য মডেলের প্রয়োজন হবে।
সাইমন হোমস

21
এছাড়াও চেকআউট useDb(): 3.8 পাওয়া অন্তর্নিহিত সংযোগ পুল ভাগ করার জন্য github.com/LearnBoost/mongoose/wiki/...
aaronheckmann

1
ধরুন আমার কাছে অটো-জেনারেটেড ডাটাবেস রয়েছে (বলুন এন ডাটাবেসের সংখ্যা)। দু-একটি নয়। প্রতিটি ডাটাবেসের জন্য পৃথক মডেল তৈরি না করে এগুলির সাথে সংযোগ করার কোনও উপায় আছে কি?
অনুজ কৃষ্ণন জি

1
@ অণুজকৃষ্ণনজি আমি মনে করি না এটি সম্ভব, না। প্রতিটি ডাটাবেসের বিপরীতে আপনাকে মডেল তৈরি করতে হবে। যাইহোক, আমি ইতিমধ্যে আমার উত্তরে আগেই বলেছি, আপনি সংযোগগুলির মধ্যে স্কিমা ভাগ করতে সক্ষম হতে পারেন যা কিছু কোডিংয়ের সময় সাশ্রয় করতে পারে।
রবার্টক্লেপ

1
আপনি বিভিন্ন মডেল জুড়ে স্কিমা ভাগ করতে পারেন, এবং তাই ডিবিগুলি s var newSchema = new mongoose.Schema({ ... }), var model2 = conn1.model('newModel', newSchema),var model2 = conn2.model('newModel', newSchema)
দান

41

খুব দেরিতে তবে এটি কারও সাহায্য করতে পারে। বর্তমানের উত্তরগুলি ধরে নিয়েছে যে আপনি নিজের সংযোগ এবং মডেলগুলির জন্য একই ফাইলটি ব্যবহার করছেন।

বাস্তব জীবনে এমন একটি উচ্চ সম্ভাবনা রয়েছে যে আপনি আপনার মডেলগুলি বিভিন্ন ফাইলগুলিতে বিভক্ত করছেন। আপনি আপনার মূল ফাইলটিতে এরকম কিছু ব্যবহার করতে পারেন:

mongoose.connect('mongodb://localhost/default');

const db = mongoose.connection;

db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', () => {
  console.log('connected');
});

যা এটি ডক্সে বর্ণিত ঠিক ঠিক। এবং তারপরে আপনার মডেল ফাইলগুলিতে নিম্নলিখিতগুলির মতো কিছু করুন:

import mongoose, { Schema } from 'mongoose';

const userInfoSchema = new Schema({
  createdAt: {
    type: Date,
    required: true,
    default: new Date(),
  },
  // ...other fields
});

const myDB = mongoose.connection.useDb('myDB');

const UserInfo = myDB.model('userInfo', userInfoSchema);

export default UserInfo;

যেখানে মাইডিবি আপনার ডাটাবেসের নাম।


আপনাকে ধন্যবাদ - আমি একক প্রয়োগের মধ্যে 3 টি পৃথক ডাটাবেস ব্যবহার করতে সক্ষম হয়েছি: কনস্ট মঙ্গুজ = প্রয়োজনীয় ('মঙ্গুজ'); কনস্ট স্কিমা = মঙ্গুজ.শ্মিমা; কনস্ট মাইস্কেমা = নতুন স্কিমা ({}); কনস্ট মাইডব্বর = মংগস.কোনিশন.উসডিবি ('মাইডিবি') মডিউল.এক্সপোর্টস = মাইডব্বর.মোডেল ('মাই কালেকশন', মাইস্কেমা);
জননাথন এনসলিন

2
অবশ্যই সেরা এবং সবচেয়ে বাস্তব বিশ্বের উদাহরণ। ডিফল্ট ডিবিতে সংযুক্ত হন (ঠিক যেমন আপনি যদি এসকিউএল সার্ভারের মতো কিছু ব্যবহার করছিলেন) এবং তারপরে যথাযথ ডাটাবেসে আপনার ডিএমএল লক্ষ্যবস্তু করতে ইউডিডিবি ব্যবহার করুন। (আপনার ব্যবহারকারীদের এক ডিবিতে এবং অন্যের ডেটাতে রাখার জন্য খুব সহায়ক)) অবশেষে আপনি যখন একই সার্ভারে অনুরোধগুলি প্রেরণ করছেন তখন একাধিক সংযোগ তৈরি করা শুরু করার দরকার নেই। এখন, আপনি যদি দুটি ভিন্ন সার্ভারের সাথে সংযোগ স্থাপন করছিলেন তবে এটি মাছের আলাদা কেতলি।
নিউক্লিক

2
যেমনটি @ ওয়েড বলেছেন, যতক্ষণ আমি এই সমাধানটি বুঝতে পারি কেবল তখনই কাজ করে যখন সমস্ত ডাটাবেস একই সার্ভারে থাকে। এটি যদি ওপি-র প্রশ্নের উত্তর দেয় এবং আইএমও কিছুটা বিভ্রান্তিকর হয় তবে তা পরিষ্কার নয়।
জোনিবা

মোংগোডিবি আটলাস থেকে স্থানান্তরিত testকরার জন্য এবং একাধিক সংযোগ স্থাপন এড়াতে আমার এটিই প্রয়োজন । যাইহোক, আমিও .dbশেষে ( const v1 = mongoose.connection.useDb('test').db) পুরানো ডিবি হিসাবে মঙ্গুজ পরিচালিত হওয়ার দরকার নেই।
পোলভ

37

বিকল্প পদ্ধতির হিসাবে, মঙ্গুজ ডিফল্ট উদাহরণে একটি নতুন উদাহরণের জন্য কোনও কনস্ট্রাক্টর রফতানি করে। সুতরাং এর মতো কিছু সম্ভব।

var Mongoose = require('mongoose').Mongoose;

var instance1 = new Mongoose();
instance1.connect('foo');

var instance2 = new Mongoose();
instance2.connect('bar');

পৃথক ডেটা উত্সগুলির সাথে কাজ করার সময় এবং আপনি যখন প্রতিটি ব্যবহারকারীর বা অনুরোধের জন্য পৃথক ডাটাবেস প্রসঙ্গ রাখতে চান এটি খুব কার্যকর। আপনার যত্নবান হওয়া দরকার, কারণ এটি করার সময় প্রচুর সংযোগ তৈরি করা সম্ভব। যখন দৃষ্টান্তগুলির প্রয়োজন নেই তখন সংযোগ বিচ্ছিন্ন করে () কল করতে ভুলবেন না এবং প্রতিটি উদাহরণ দ্বারা নির্মিত পুলের আকারও সীমাবদ্ধ করে নিন Make


1
'উত্তর উপরে' লেখার এটি কি অন্য উপায় ?
প্রেভিন 18

11
এটি উপরের উত্তর নয়, এটি আরও ভাল। উপরের উত্তরটি অকারণে মঙ্গুজের একাধিক অনুলিপি ইনস্টল করে।
মার্টন ভাল্ডেস ডি লিয়ন

আমি এই পদ্ধতিটি ব্যবহার করে কীভাবে প্রশ্ন করব?
shahidfoy

2
await instance1.connection.collection('foo').insert({ foo: 'bar', }) await instance2.connection.collection('foo').insert({ foo: 'zoo', })
আবদুল্লাহ আল বার্মাভি 26'19

প্রকৃতপক্ষে আমার ক্ষেত্রে আরও ভাল কাজ করা যেহেতু প্রতিটি সংযোগের জন্য আমার কাছে সম্পূর্ণ আলাদা শংসাপত্র রয়েছে, কেবল মডেল এবং ডাটাবেসগুলি ছেড়ে দেওয়া যাক।
tzn

0

কিছুটা অপ্টিমাইজড (আমার পক্ষে কমপক্ষে) সমাধান। এটি একটি ফাইল db.js এ লিখুন এবং এটি যেখানেই প্রয়োজন সেখানে এটি প্রয়োজন এবং এটি একটি ফাংশন কল দিয়ে কল করুন এবং আপনি যেতে ভাল।

   const MongoClient = require('mongodb').MongoClient;
    async function getConnections(url,db){
        return new Promise((resolve,reject)=>{
            MongoClient.connect(url, { useUnifiedTopology: true },function(err, client) {
                if(err) { console.error(err) 
                    resolve(false);
                }
                else{
                    resolve(client.db(db));
                }
            })
        });
    }

    module.exports = async function(){
        let dbs      = [];
        dbs['db1']     = await getConnections('mongodb://localhost:27017/','db1');
        dbs['db2']     = await getConnections('mongodb://localhost:27017/','db2');
        return dbs;
    };
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.