2017-02-17 37 views
2

有很多SO的存在,但有一个我不明白的简单的东西,因此创建了这个SO。MongoDB在连接字符串中指定数据库

看看下面的连接字符串mongodb//admin:[email protected]/my_database。有了这个连接字符串,我期望我能够连接到MongoDB实例,并且具体数据库为my_database

以下几个SO和其他的,这应该有效,但如果我看MongoDB的官方文档,database选项是我想要认证的数据库。

/database是要登录的数据库的名称,因此只有在使用用户名:password @语法时才是相关的。如果未指定,则默认使用“admin”数据库。

我想让我的用户通过管理数据库进行身份验证(因为这是我的用户所在位置),但我想访问数据库my_database。我期望这个程序的工作:

private static string _connectionString = ConfigurationManager.ConnectionStrings["MongoDB"].ToString(); 

public static IMongoDatabase GetDatabase() 
{ 
    var _url = MongoUrl.Create(_connectionString); 
    var _databaseName = _url.DatabaseName; 
    return new MongoClient(_connectionString).GetDatabase(_databaseName); 
} 

但是,每当我这样做,我收到任何对MongoDB的调用超时。一个例子是这样的:

public List<SomeObject> GetAllObjects() 
{ 
    var database = DatabaseInstance.GetDatabase(); 

    // Error is thrown here (timout after 30000ms) 
    var objects = database.Getcollection<SomeObject>("SomeObjects").Find(Builders<SomeObject>.Filter.Empty).Find(); 
    return objects; 
} 

现在,如果我要删除的连接字符串和硬编码的数据库名称的数据库在我return new MongoClient(_connectionString).GetDatabase("my_database");,一切正常。

这是我不明白连接字符串中的/数据库选项。如果有人能够阐明这一点,我会非常感激。

回答

6

在连接字符串中可以应用选项authSource

拿这个例子:mongodb://admin:[email protected]/my_database?authSource=admin

现在,你应该能够得到连接字符串当前数据库的名称,但在接近admin数据库进行身份验证,使用此代码:

private static string _connectionString = ConfigurationManager.ConnectionStrings["MongoDB"].ToString(); 

public static IMongoDatabase GetDatabase() 
{ 
    var _databaseName = MongoUrl.Create(_connectionString).DatabaseName; 
    return new MongoClient(_connectionString).GetDatabase(_databaseName); 
}