[javascript] 단일 node.js 프로젝트의 몽구스 및 다중 데이터베이스

하위 프로젝트가 포함 된 Node.js 프로젝트를 수행하고 있습니다. 하나의 하위 프로젝트에는 하나의 Mongodb 데이터베이스가 있고 Mongoose는 db를 래핑하고 쿼리하는 데 사용됩니다. 하지만 문제는

  • Mongoose는 모델이 하나의 연결에서 빌드되기 때문에 단일 mongoose 인스턴스에서 여러 데이터베이스를 사용할 수 없습니다.
  • 여러 몽구스 인스턴스를 사용하기 위해 Node.js는 .js 파일에 캐싱 시스템이 있으므로 여러 모듈 인스턴스를 허용하지 않습니다 require(). Node.js에서 모듈 캐싱을 비활성화하는 것을 알고 있지만 몽구스에만 필요하므로 좋은 솔루션이 아니라고 생각합니다.

    내가 사용 해봤 createConnection()openSet()몽구스에 있지만 해결책이 아니었다.

    새 몽구스 인스턴스를 하위 프로젝트에 전달하기 위해 mongoose 인스턴스 ( http://blog.imaginea.com/deep-copy-in-javascript/ ) 를 딥 복사하려고 시도했지만 RangeError: Maximum call stack size exceeded.

몽구스와 함께 여러 데이터베이스를 사용 하거나이 문제에 대한 해결 방법이 있는지 알고 싶습니다. 몽구스는 아주 쉽고 빠르다고 생각하기 때문입니다. 아니면 권장 사항으로 다른 모듈이 있습니까?



답변

한 가지 할 수있는 일은 각 프로젝트에 대한 하위 폴더가있을 수 있다는 것입니다. 따라서 해당 하위 폴더에 mongoose를 설치하고 각 하위 응용 프로그램의 자체 폴더에서 mongoose를 필요로합니다. 프로젝트 루트 또는 글로벌이 아닙니다. 따라서 하나의 하위 프로젝트, 하나의 몽구스 설치 및 하나의 몽구스 인스턴스.

-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;

bar_db_connect.js에서

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

이제 mongoose로 여러 데이터베이스에 액세스 할 수 있습니다.


답변

정밀한 설명서 에 따르면 , 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' }
}));

나는 당신이 그들 사이에 스키마를 공유 할 수 있다고 확신하지만 당신은 확인해야한다.


답변

꽤 늦었지만 이것은 누군가를 도울 수 있습니다. 현재 답변은 연결 및 모델에 동일한 파일을 사용하고 있다고 가정합니다.

실생활에서는 모델을 다른 파일로 분할 할 가능성이 높습니다. 주 파일에서 다음과 같이 사용할 수 있습니다.

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;

myDB는 데이터베이스 이름입니다.


답변

대안으로 Mongoose는 기본 인스턴스에서 새 인스턴스에 대한 생성자를 내 보냅니다. 그래서 이와 같은 것이 가능합니다.

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

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

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

이는 별도의 데이터 소스로 작업 할 때 그리고 각 사용자 또는 요청에 대해 별도의 데이터베이스 컨텍스트를 갖고 싶을 때 매우 유용합니다. 이 작업을 수행 할 때 많은 연결을 생성 할 수 있으므로주의해야합니다. 인스턴스가 필요하지 않은 경우 disconnect ()를 호출하고 각 인스턴스에서 생성되는 풀 크기를 제한해야합니다.


답변

조금 최적화 된 (최소한) 솔루션. 이것을 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;
    };


답변