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

Posted

技术标签:

【中文标题】如何在C#中获取连接字符串中指定的Mongo数据库【英文标题】:How to get the Mongo database specified in connection string in C# 【发布时间】:2011-08-26 08:18:52 【问题描述】:

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

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

mongodb://localhost/mydb

我希望能够从mydb 发送至db.GetCollection("mycollection")

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

【问题讨论】:

【参考方案1】:

更新:

MongoServer.Create 现在已过时(感谢@aknuds1)。而是使用以下代码:

var _server = new MongoClient(connectionString).GetServer();

这很容易。您应该首先从连接字符串中获取数据库名称,然后按名称获取数据库。完整示例:

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);

重要提示:如果您的数据库和auth 数据库不同,您可以添加一个authSource= 查询参数来指定不同的auth 数据库。 (谢谢@chrisdrobison)

From docs:

注意如果您使用数据库段作为初始数据库 使用,但指定的用户名和密码在 不同的数据库,你可以使用 authSource 选项来指定 定义凭据的数据库。例如, mongodb://user:pass@hostname/db1?authSource=userDb 将进行身份验证 针对 userDb 数据库而不是 db1 的凭据。

【讨论】:

啊,好吧 - 我明白了我的问题。我无权访问连接字符串,只能访问已经创建的 MongoServer 对象。而且它似乎不知道连接字符串指定的数据库。谢谢。 MongoServer.Create 已过时。 删除了我的最后一条评论,因为它不太正确。不过要注意的一件事是,根据 Mongo 文档,它还告诉驱动程序您要针对哪个数据库进行身份验证。如果你的数据库和auth数据库不同,你可以添加一个authSource=查询参数来指定不同的auth数据库。 @chrisdrobison 谢谢!这很重要(更新了我的答案)!这个问题在 3.5 年前得到了回答。事情发生了变化:)【参考方案2】:

在使用最新版本的 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");

【讨论】:

这应该被赞成,虽然我知道这是一个旧线程。这是在 2.3 版中获得此功能的唯一方法。感谢您的回答,经过一番搜索才到这里。【参考方案3】:

使用官方 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");

【讨论】:

fwif:这也适用于使用 mongo 驱动程序 1.10 的 Xamarin Studio 5.8.1【参考方案4】:

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

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

var db =  MongoDatabase.Create(connectionString);
var coll = db.GetCollection("MyCollection");

【讨论】:

随着时间的推移,MongoDatabase.Create() 自驱动程序版本 1.7 起已被淘汰 @runTarm 但是时间在继续,C# mongo 连接字符串中数据库名称的规范并没有被淘汰。

以上是关于如何在C#中获取连接字符串中指定的Mongo数据库的主要内容,如果未能解决你的问题,请参考以下文章

C#如何读取XML中指定的节点值?

从Web.Config获取多个connectionStrings到字典c#没有循环

项目App.config中指定的ConnectionStrings不在ConfigurationManager.ConnectionStrings中

在构建 Java GraphQL API 时,如何避免从数据库中过度获取(即仅获取查询中指定的字段)?

在 c# / ReadAsync 中读取二进制数据而不是读取计数中指定的所有内容

JAVA 删除字符串中指定的字符