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

7

我有一个正在运行的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);

在我的主文件中,我有两个连接:
其中一个是系统数据库。
connection_uri = "mongodb://localhost:27017/";
system_db = mongoose.connect(connection_uri.concat("sparks"), {
    native_parser : true
}, function(err){
    if (err) throw err;
});

另一个是用户数据库

 user_db = mongoose.createConnection(connection_uri.concat(user_id));

然后我在主文件中有这段代码,根据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();
    });
});

问题在于上面的app.param函数没有找到任何与teams匹配的结果,尽管它们存在于user_db数据库的集合中。这意味着,我认为我的模型指向了错误的数据库?不知道是否正确?我该如何解决?

1个回答

7
下面的方法打开一个连接到 system_db 并绑定到 mongoose 对象,即当前的 mongoose 对象被修改。返回类型不是一个 Connection
system_db = mongoose.connect(connection_uri.concat("sparks")...

现在当您再次执行以下操作时:
user_db = mongoose.createConnection(connection_uri.concat(user_id));

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

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

var Team = mongoose.model('teams',authSchema);

任何对此model的操作实际上都发生在mongoose实例所持有的connection中,而该连接是system_db数据库的一部分。

因此,您需要从user_db连接获取模型:

var user_db = mongoose.createConnection(..);
// retrieve the Team model
var Team= user_db.model('teams'); // not from mongoose instance.

在任何需要获取连接的地方使用createConnection


嗯,谢谢,这让人沮丧。我想在定义user_db变量之前能够加载包含Team的文件... - Alexander Mills
此外,如果用户注销并以不同的用户登录,则user_db变量将被重新定义。 - Alexander Mills
在理想的宇宙中,我可以将数据库变量作为参数传递给保存方法,这样就可以像这样使用:var team = new Team({}); team.save(user_db); 你知道我的意思吗? - Alexander Mills
为什么要为每个用户维护不同的数据库?你应该将数据库查询“特定”于用户,而不是为每个用户维护一个数据库。这样模型团队将对所有用户通用。 - BatScream
每个用户的收藏可能非常大,因此最好将它们放在单独的数据库中。我相信这样做是更好的。 - Alexander Mills
4
原来让每个用户在不同的数据库中是个坏主意。 - Alexander Mills

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接