MongoDB 在连接字符串中指定数据库

MongoDB specify database in connection string

那里有很多 SO,但有一点我不明白,因此创建了这个 SO。

取下面的连接字符串mongodb//admin:1234@10.0.125.1/my_database。使用此连接字符串,我希望能够连接到 MongoDB 实例和特定数据库 my_database.

按照几个 SO 和其他文章,这应该可以工作,但是如果我查看 MongoDB 的官方文档,database 选项是我要验证的数据库。

/database is the name of the database to login to and thus is only relevant if the username:password@ syntax is used. If not specified the “admin” database will be used by default.

我希望我的用户通过管理数据库的身份验证(因为这是我的用户所在的位置),但我想访问数据库 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 选项的地方。如果有人能对此有所了解,我将不胜感激。

在连接字符串中可以应用选项 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);
}