告诉 Mongoose 使用哪个数据库 - 在 Node.js Express 应用程序中

Ale*_*lls 7 mongoose node.js express

我正在运行 Node.js Express Web 应用程序。

我有两个数据库连接,system_db是用“Mongoose.connect”创建的,user_db是用“Mongoose.createConnection”创建的。这似乎使它们分开并具有不同的连接池。尽管这可能是问题的症结所在。

我有处理 Mongoose 模型的代码

在模型文件中我有:

var authSchema = mongoose.Schema({
    teamName: String,
    league: String,
    players: []

});


var Team = module.exports = mongoose.model('teams',authSchema);
Run Code Online (Sandbox Code Playgroud)

在我的主文件中我有两个连接:

一个是系统数据库

connection_uri = "mongodb://localhost:27017/";
system_db = mongoose.connect(connection_uri.concat("sparks"), {
    native_parser : true
}, function(err){
    if (err) throw err;
});
Run Code Online (Sandbox Code Playgroud)

另一个是用户数据库

 user_db = mongoose.createConnection(connection_uri.concat(user_id));
Run Code Online (Sandbox Code Playgroud)

然后我的主文件中有这段代码,它根据 id 查找 Team 对象:

app.param('team_id', function(req, res, next, team_id) {

    Team.findOne(team_id, function(err, team) {

        if (err) {
            return next(err);
        }
        if (!team) {
            throw new Error("no team matched");
        }
        req.team = team;
        next();
    });
});
Run Code Online (Sandbox Code Playgroud)

问题是上面的 app.param 函数没有找到任何团队匹配项,即使它们存在于 user_db 数据库的集合中。这意味着,我认为我的模型以某种方式指向了错误的数据库?不知何故,它必须指向此 system_db 而不是 user_db。这可能是对的吗?我该如何解决这个问题?

Bat*_*eam 7

下面的方法打开到 的连接system_db并绑定到该mongoose对象,即修改当前的 mongoose 对象。返回类型不是.Connection

system_db = mongoose.connect(connection_uri.concat("sparks")...
Run Code Online (Sandbox Code Playgroud)

现在当你再次这样做时:

user_db = mongoose.createConnection(connection_uri.concat(user_id));
Run Code Online (Sandbox Code Playgroud)

这将创建一个新的数据库连接user并返回一个连接,但不会修改mongoose实例。猫鼬实例仍然绑定到system_db数据库连接。

由于 Team 模型是从同一个 mongoose 实例获取的,

var Team = mongoose.model('teams',authSchema);
Run Code Online (Sandbox Code Playgroud)

无论对此执行什么操作,model都会有效地发生在connectionmongoose 实例所持有的数据库中system_db

所以你需要从连接中获取模型user_db

var user_db = mongoose.createConnection(..);
// retrieve the Team model
var Team= user_db.model('teams'); // not from mongoose instance.
Run Code Online (Sandbox Code Playgroud)

createConnection在您想要获得连接的任何地方使用。

  • 事实证明,让每个用户位于不同的数据库中是一个坏主意 (4认同)