那里有大量的SO,但有一个我不理解的简单事物,因此创造了这个SO。
使用以下连接字符串mongodb//admin:1234@10.0.125.1/my_database
。使用此连接字符串,我希望能够连接到MongoDB实例和特定数据库my_database
。
遵循几个SO和其他rarticle,这应该有效,但如果我查看MongoDB的官方文档,database
选项是我想要验证的数据库。
/ database是要登录的数据库的名称,因此仅在使用username:password @ syntax时才相关。如果未指定,默认情况下将使用“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");
中对数据库名称进行硬编码,那么一切都按预期工作。
这是我不了解连接字符串中的 / database 选项的地方。如果有人能对此有所了解,我真的很感激。
答案 0 :(得分:8)
在连接字符串中可以应用选项authSource
。
举个例子:mongodb://admin:1234@some.ip/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);
}