如何将数据库名称作为变量

问题描述:

我正在为使用Meteor和MongoDB的员工创建一个应用程序。这个应用程序将被多个组织使用。所以我会为每个组织制作一个单独的数据库。我在流星中遇到了一个关于如何将数据库名称和集合名称保存为变量的问题。数据库名称将在登录时决定。然后我会保留DB名称Session
集合名称也可以是一个变量。如何将数据库名称作为变量

例如:

var dbName = Session.get("dbName"); //for eg dbName="redex" 
var collectionName = Session.get("collectionName"); // for ex collectionName="employees" 
Employees = new Mongo.Collection(collectionName); 

如何管理在这种情况下,变量?

您必须创建一个server methodcreates a given database根据dbNamecollectionName参数:

'newDatabase': function (dbName, collectionName) { 
    var d = new MongoInternals.RemoteCollectionDriver(process.env.MONGO_URL.replace("originDB", dbName)); 
    Employees = new Mongo.Collection(collectionName, { _driver: d }); 
} 

您还必须声明你的客户端是新的集合:

Meteor.call('newDatabase', Session.get("dbName"), Session.get("collectionName"), function (err, res) { 
    if (!err) 
    Employees = new Mongo.Collection(Session.get("collectionName")); 
}); 
+0

谢谢。它的工作。但有一个问题。我不能在不同的数据库中使用相同的集合名称。 调用方法'connectNewDatabase'时出现异常错误:名为'/ employees/insert'的方法已在函数._。中的每个._。forEach(packages/ddp/livedata_server.js:1461:1 )处定义为 。下划线/ underscore.js:113:1) –

+0

根据[这个答案](http://stackoverflow.com/a/25915025/1439597),你没有什么可以做的,但解决这个问题... – SylvainB

+0

this意味着我们需要具有唯一的集合名称,例如,如果数据库名称是redix,那么集合名称将是redix.employees,如果数据库名称是apl,则使用apl.employees –