单节点.js项目中的Mongoose和多个数据库

pup*_*pot 108 javascript database mongoose mongodb node.js

我正在做一个包含子项目的Node.js项目.一个子项目将有一个Mongodb数据库,Mongoose将用于包装和查询db.但问题是

  • Mongoose不允许在单个mongoose实例中使用多个数据库,因为模型是在一个连接上构建的.
  • 要使用多个mongoose实例,Node.js不允许多个模块实例,因为它具有缓存系统require().我知道在Node.js中禁用模块缓存,但我认为这不是一个好的解决方案,因为它只需要mongoose.

    我曾尝试使用createConnection()openSet()猫鼬,但它不是解决方案.

    我试图深度复制mongoose实例(http://blog.imaginea.com/deep-copy-in-javascript/)以将新的mongoose实例传递给子项目,但它会抛出RangeError: Maximum call stack size exceeded.

我想知道是否有使用多个数据库与mongoose或任何解决方法来解决这个问题?因为我认为猫鼬非常容易和快速.或任何其他模块作为建议?

rob*_*lep 194

根据精细手册,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' }
}));
Run Code Online (Sandbox Code Playgroud)

我很确定你可以在它们之间共享架构,但你必须检查以确保它.

  • 还要检查3.8中的"useDb()"以共享底层连接池:https://github.com/LearnBoost/mongoose/wiki/3.8-Release-Notes#connection-pool-sharing (21认同)
  • 是的,我认为命名连接和共享模式是可行的方法.根据罗伯特的例子,每个连接都需要一个独特的模型. (3认同)

小智 34

您可以做的一件事是,您可能拥有每个项目的子文件夹.因此,在子文件夹中安装mongoose,并在每个子应用程序中从自己的文件夹中安装require()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/
Run Code Online (Sandbox Code Playgroud)

在foo_db_connect.js中

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/foo_db');
module.exports = exports = mongoose;
Run Code Online (Sandbox Code Playgroud)

在bar_db_connect.js中

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/bar_db');
module.exports = exports = mongoose;
Run Code Online (Sandbox Code Playgroud)

在db_access.js文件中

var mongoose = require("./foo_db_connect.js"); // bar_db_connect.js for bar app
Run Code Online (Sandbox Code Playgroud)

现在,您可以使用mongoose访问多个数据库.

  • 这看起来像是项目的巨大负担.你不这么认为吗? (3认同)
  • 这意味着每个项目都会有自己的连接。您将无法管理10万个连接。我认为最好使用使用相同连接池的`useDb`命令。 (2认同)

Eri*_*ric 31

作为替代方法,Mongoose会在默认实例上为新实例导出构造函数.所以这样的事情是可能的.

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

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

var instance2 = new Mongoose();
instance2.connect('bar');
Run Code Online (Sandbox Code Playgroud)

这在处理单独的数据源时非常有用,并且当您希望为每个用户或请求创建单独的数据库上下文时也是如此.您需要小心,因为在执行此操作时可能会创建大量连接.确保在不需要实例时调用disconnect(),并限制每个实例创建的池大小.

  • 这不是上面的答案,它更好.以上答案不必要地安装了Mongoose的多个副本. (8认同)
  • `等待instance1.connection.collection('foo').insert({ foo: 'bar', }) 等待instance2.connection.collection('foo').insert({ foo: 'zoo', })` (2认同)

Tah*_*sin 25

很晚但这可能对某人有所帮助.当前答案假定您使用相同的文件作为连接和模型.

在现实生活中,很有可能将模型分成不同的文件.你可以在主文件中使用这样的东西:

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

const db = mongoose.connection;

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

这就是文档中描述的内容.然后在您的模型文件中,执行以下操作:

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;
Run Code Online (Sandbox Code Playgroud)

myDB是您的数据库名称.

  • 谢谢 - 我能够在一个应用程序中使用 3 个不同的数据库: const mongoose = require('mongoose'); const Schema = mongoose.Schema; const mySchema = 新架构 ({}); const mydbvar = mongoose.connection.useDb('mydb') module.exports = mydbvar.model('myCollection', MySchema); (2认同)
  • 绝对是最好,最真实的例子。连接到默认数据库(就像使用SQL Server一样),然后利用useDb将DML定位到适当的数据库。(这有助于将用户保留在一个数据库中,而将数据保留在另一个数据库中。)最终将请求发送到同一服务器时,无需开始建立多个连接。现在,如果您要连接到两个不同的服务器,那将是另一回事。 (2认同)
  • 正如@Wade 所说,据我所知,这个解决方案只有在所有数据库都在同一台服务器上时才有效。目前尚不清楚这是否回答了 OP 的问题,而且 IMO 有点误导。 (2认同)

小智 7

单个 Node.js 项目中的 Mongoose 和多个数据库

使用useDb解决这个问题

例子

//product databse 
const myDB = mongoose.connection.useDb('product');
module.exports = myDB.model("Snack", snackSchema);
//user databse
const myDB = mongoose.connection.useDb('user');
module.exports = myDB.model("User", userSchema);
Run Code Online (Sandbox Code Playgroud)