Mongoose和单个node.js项目中的多个数据库
我正在做一个包含子项目的Node.js项目。 一个子项目将有一个Mongodb数据库,Mongoose将用于包装和查询数据库。 但问题是
- Mongoose不允许在单个mongoose实例中使用多个数据库,因为模型是在一个连接上构build的。
-
为了使用多个mongoose实例,Node.js不允许多个模块实例,因为它在
require()
具有caching系统。 我知道在Node.js禁用模块caching,但我认为这不是一个好的解决scheme,因为它只需要mongoose。我试图在mongoose中使用
createConnection()
和openSet()
,但这不是解决scheme。我试图深入复制mongoose实例( http://blog.imaginea.com/deep-copy-in-javascript/ )传递新的mongoose实例到子项目,但它
RangeError: Maximum call stack size exceeded
。
我想知道是否有任何使用mongoose或任何解决方法为这个问题使用多个数据库? 因为我认为mongoose是相当容易和快速的。 或者其他任何模块作为build议?
你可以做的一件事是,你可能有每个项目的子文件夹。 因此,在该子文件夹中安装mongoose,并在每个子应用程序中从自己的文件夹中需要()mongoose。 不是从项目根目录或从全球。 所以一个子项目,一个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('./node_modules/mongoose'); mongoose.connect('mongodb://localhost/foo_db'); module.exports = exports = mongoose;
在bar_db_connect.js中
var mongoose = require('./node_modules/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()
连接到多个数据库。
但是,您需要为每个连接/数据库创build单独的模型:
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会在默认实例上为新实例导出构造函数。 所以这样的事情是可能的。
var Mongoose = require('mongoose').Mongoose; var instance1 = new Mongoose(); instance1.connect('foo'); var instance2 = new Mongoose(); instance2.connect('bar');
这在使用单独的数据源时非常有用,而且当您希望为每个用户或请求分别创build一个数据库上下文时。 你需要小心,因为这样做可能会创build很多连接。 确保在不需要实例时调用disconnect(),并限制每个实例创build的池大小。