88

I would like to connect to the database specified in the connection string, without specifying it again in GetDatabase.

For example, if I have a connection string like this;

mongodb://localhost/mydb

I would like to be able to db.GetCollection("mycollection") from mydb.

This would allow the database name to be configured easily in the app.config file.

Pete Montgomery
  • 4,060
  • 3
  • 30
  • 40

4 Answers4

96

Update:

MongoServer.Create is obsolete now (thanks to @aknuds1). Instead this use following code:

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

It's easy. You should first take database name from connection string and then get database by name. Complete example:

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

Important: If your database and auth database are different, you can add a authSource= query parameter to specify a different auth database. (thank you to @chrisdrobison)

From docs:

NOTE If you are using the database segment as the initial database to use, but the username and password specified are defined in a different database, you can use the authSource option to specify the database in which the credential is defined. For example, mongodb://user:pass@hostname/db1?authSource=userDb would authenticate the credential against the userDb database instead of db1.

Community
  • 1
  • 1
Andrew Orsich
  • 52,935
  • 16
  • 139
  • 134
  • Ah, ok - I see my problem. I don't have access to the connection string, but only the already-created MongoServer object. And it doesn't appear to know about the connection string-specified database. Thanks. – Pete Montgomery Aug 26 '11 at 09:01
  • MongoServer.Create is obsolete. – aknuds1 Jan 23 '13 at 12:36
  • Deleted my last comment since it wasn't quite correct. One thing to note though is that according to the Mongo docs, that it also telling the driver which database you want to auth against. If your database and auth database are different, you can add a authSource= query parameter to specify a different auth database. – chrisdrobison Jan 30 '15 at 01:47
  • @chrisdrobison Thank you! This important to know (updated my answer)! The question was answered 3.5 years ago. Things changed :) – Andrew Orsich Jan 30 '15 at 18:47
31

In this moment with the last version of the C# driver (2.3.0) the only way I found to get the database name specified in connection string is this:

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");
Paolo Laurenti
  • 2,714
  • 2
  • 16
  • 18
  • 3
    This should be upvoted, altough I know this is an old thread. This is the only way to get this in Version 2.3. Thanks for the answer, it took some searching to get here. – ejcortes Jun 09 '17 at 19:28
10

With version 1.7 of the official 10gen driver, this is the current (non-obsolete) 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");
aknuds1
  • 65,625
  • 67
  • 195
  • 317
5

The answer below is apparently obsolete now, but works with older drivers. See comments.

If you have the connection string you could also use MongoDatabase directly:

var db =  MongoDatabase.Create(connectionString);
var coll = db.GetCollection("MyCollection");
Christian Horsdal
  • 4,914
  • 23
  • 24