2015-12-17 2 views
2

Как мне вернуть имя первичной базы данных? Допустим database3 был основнымMongoDb Connect to Replica Set Primary Issue C#

Благодаря

var connString = "mongodb://database1,database2,database3/?replicaSet=repl"; 
var client = new MongoClient(connString); 
var server = client.GetServer().Instances.FirstOrDefault(server => server.IsPrimary); 
var address = server.Address; 
+0

Какова цель этого кода? Зачем вам нужен адрес Первичного? –

+0

Чтобы вместо первичного адреса в качестве константы и, допустим, другой сервер был установлен как первичный, я всегда буду иметь правильный адрес – Antirip

+1

Я добавил ответ. Первичный сервер не отображается в драйвере MongoDB, но вы можете запросить его у самого MongoDB с помощью '{isMaster: 1}' и разбора возвращаемого документа. – Jaco

ответ

2

Посмотрев на исходный код драйвера MongoDB, не существует простой способ, чтобы получить имя основного сервера от самого водителя. Однако вы можете запросить имя сервера в MOngoDB, выполнив {isMaster:1}, используя RunCommand. Затем вы можете проанализировать первичный сервер из возвращаемого документа JSON. Этот подход работает независимо от того, подключен ли к основному или вторичному серверу.

var mongoClient = new MongoClient(clientSettings); 
var testDB = mongoClient.GetDatabase("test"); 
var cmd = new BsonDocument("isMaster", "1"); 
var result = testDB.RunCommand<BsonDocument>(cmd); 
var primaryServer = result.Where(x => x.Name == "primary").FirstOrDefault().Value.ToString(); 
1

Вы действительно должны не ручки, соединяющиеся с правом сервера самостоятельно. Драйвер MongoDB обрабатывает это для вас.

Просто укажите все свои серверы в строке соединений, и драйвер подключится к одному из них и получит собственное состояние набора реплик самостоятельно. Затем драйвер направит операции записи на текущий первичный. Операции чтения могут быть направлены на основной или любой другой сервер, в зависимости от заданного вами read preference.

Вы можете прочитать о формировании набора реплик строки подключения здесь: https://docs.mongodb.org/v3.0/reference/connection-string/

+0

Привет, Dmytro спасибо за ответ. Я отредактировал мой вопрос выше, чтобы точно, что я хочу. Мне просто нужно имя основного сервера, поэтому я могу передать это другому методу. – Antirip

+0

Как объяснил Дмитро, плохой практикой является использование имени сервера первичного. Администратор баз данных ожидает, что приложения автоматически начнут использовать новый первичный элемент, когда текущий первичный уровень будет сведен на нет, и администратор баз данных не будет счастлив, если вы явно ссылаетесь на один сервер. – Jaco

2

Благодаря Жако для сдачи меня на верном пути, я решил свою проблему, выполнив следующие действия

public static string GetPrimaryDatabase() 
{ 
    var mongoClient = new MongoClient(clientSettings); 
    var server = mongoClient.GetServer(); 
    var database = server.GetDatabase("test"); 

    var cmd = new CommandDocument("isMaster", "1"); 
    var result = database.RunCommand(cmd); 

     return result.Response.FirstOrDefault(
      response => response.ToString().Contains("primary")).Value.ToString(); 
} 
Смежные вопросы