2017-02-17 5 views
2

Es gibt viele SO's da draußen, aber da ist eine einfache Sache, die ich nicht verstehe, daher die Erstellung dieses SO.MongoDB Datenbank in Verbindungszeichenfolge angeben

Nehmen Sie die folgende Verbindungszeichenfolge mongodb//admin:[email protected]/my_database. Mit dieser Verbindungszeichenfolge würde ich erwarten, dass ich eine Verbindung zur MongoDB-Instanz und der spezifischen Datenbank my_database herstellen konnte.

Nach mehreren SO's und anderen Artikeln, sollte dies funktionieren, aber wenn ich die offizielle Dokumentation von MongoDB anschaue, ist die database Option die Datenbank, die ich authentifizieren möchte.

/database ist der Name der Datenbank, zu der man sich anmelden möchte und ist daher nur relevant, wenn der Benutzername: password @ syntax verwendet wird. Wenn nicht angegeben, wird standardmäßig die Datenbank "admin" verwendet.

Ich möchte meine Benutzer auf die Admin-Datenbank authentifiziert werden (wie das ist, wo mein Benutzer liegt), aber ich möchte my_database auf die Datenbank zuzugreifen. Ich würde dieses Verfahren erwarten zu arbeiten:

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

Aber immer, wenn ich das tue, bin ich ein Timeout für alle Anrufe an die MongoDB zu empfangen. Ein Beispiel ist dies:

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

Nun, wenn ich die Datenbank von der Verbindungszeichenfolge und Fest Code des Datenbanknamen in meinem return new MongoClient(_connectionString).GetDatabase("my_database"); entfernen war, funktioniert alles wie erwartet.

Dies ist, wo ich die /Datenbank Option in der Verbindungszeichenfolge nicht verstehe. Ich würde es wirklich schätzen, wenn jemand etwas Licht in diese Sache bringen könnte.

Antwort

6

In der Verbindungszeichenfolge ist möglich, die Option authSource anzuwenden.

Nehmen Sie dieses Beispiel: mongodb://admin:[email protected]/my_database?authSource=admin

Jetzt sollten Sie in der Lage sein, die aktuellen Datenbanknamen aus der Verbindungszeichenfolge zu erhalten, aber die Authentifizierung gegenüber der admin Datenbank, mit diesem Code:

private static string _connectionString = ConfigurationManager.ConnectionStrings["MongoDB"].ToString(); 

public static IMongoDatabase GetDatabase() 
{ 
    var _databaseName = MongoUrl.Create(_connectionString).DatabaseName; 
    return new MongoClient(_connectionString).GetDatabase(_databaseName); 
} 
Verwandte Themen