如何在C#中获取连接字符串中指定的Mongo数据库

Pet*_*ery 55 c# mongodb mongodb-.net-driver

我想连接到连接字符串中指定的数据库,而不是再次指定它GetDatabase.

例如,如果我有这样的连接字符串;

mongodb://localhost/mydb
Run Code Online (Sandbox Code Playgroud)

我希望能够db.GetCollection("mycollection")来自mydb.

这将允许在app.config文件中轻松配置数据库名称.

And*_*ich 59

更新:

MongoServer.Create现在已经过时了(感谢@ aknuds1).相反,这使用以下代码:

var _server = new MongoClient(connectionString).GetServer();
Run Code Online (Sandbox Code Playgroud)

这很简单.您应首先从连接字符串中获取数据库名称,然后按名称获取数据库.完整的例子:

var connectionString = "mongodb://localhost:27020/mydb";

//take database name from connection string
var _databaseName = MongoUrl.Create(connectionString).DatabaseName;
var _server = MongoServer.Create(connectionString);

//and then get database by database name:
_server.GetDatabase(_databaseName);
Run Code Online (Sandbox Code Playgroud)

要点:如果数据库和auth数据库不同,则可以添加authSource = query参数以指定其他auth数据库.(谢谢 @chrisdrobison)

来自docs:

注意如果要将数据库段用作要使用的初始数据库,但指定的用户名和密码是在其他数据库中定义的,则可以使用authSource选项指定定义凭据的数据库.例如,mongodb:// user:pass @ hostname/db1?authSource = userDb将根据userDb数据库而不是db1对凭证进行身份验证.


Pao*_*nti 13

在这一刻,使用最新版本的C#驱动程序(2.3.0),我发现获取连接字符串中指定的数据库名称的唯一方法是:

var connectionString = @"mongodb://usr:pwd@srv1.acme.net,srv2.acme.net,srv3.acme.net/dbName?replicaSet=rset";
var mongoUrl = new MongoUrl(connectionString);
var dbname = mongoUrl.DatabaseName;
var db = new MongoClient(mongoUrl).GetDatabase(dbname);
db.GetCollection<MyType>("myCollectionName");
Run Code Online (Sandbox Code Playgroud)

  • 这应该被赞成,尽管我知道这是一个旧线程。这是在 2.3 版中获得此功能的唯一方法。感谢您的回答,花了一些时间才到这里。 (2认同)

akn*_*ds1 9

使用官方10gen驱动程序的1.7版本,这是当前(非过时的)API:

const string uri = "mongodb://localhost/mydb";
var client = new MongoClient(uri);
var db = client.GetServer().GetDatabase(new MongoUrl(uri).DatabaseName);
var collection = db.GetCollection("mycollection");
Run Code Online (Sandbox Code Playgroud)


Chr*_*dal 5

下面的答案现在显然已经过时,但适用于较旧的驱动程序。看评论。

如果您有连接字符串,您也可以直接使用 MongoDatabase:

var db =  MongoDatabase.Create(connectionString);
var coll = db.GetCollection("MyCollection");
Run Code Online (Sandbox Code Playgroud)