Варианты подключения mongodb для драйвера c ++

Кажется, что драйверы c ++ не принимают формат URI соединения mongodb.
Там нет документации о том, как я должен создать строку подключения, как вы думаете?

Мне нужно подключиться к реплике с 3 серверами и установить параметры readPreference.

3

Решение

Пока проблемы не объяснены в ответ @ acm решены, я нашел обходной путь для плохих строк подключения драйвера C ++. Вы можете создать DBClientReplicaSet используя вектор хостов и портов следующим образом:

//First create a vector of hosts
//( you can ignore port numbers if yours are default)

vector<HostAndPort> hosts;
hosts.push_back(mongo::HostAndPort("YourHost1.com:portNumber1"));
hosts.push_back(mongo::HostAndPort("YourHost2.com:portNumber2"));
hosts.push_back(mongo::HostAndPort("YourHost3.com:portNumber3"));

//Then create a Replica Set DB Client:

mongo::DBClientReplicaSet connection("YourReplicaSetName",hosts,0);

//Connect to it now:

connection.connect();

//Authenticate to the database(s) if needed

std::string errmsg;
connection.auth("DB1Name","UserForDB1","pass1",errmsg);
connection.auth("DB2Name","UserForDB2","pass2",errmsg);

Теперь вы можете использовать вставку, обновление и т. Д., Как вы это делали с DBClientConnection, Для быстрого исправления вы можете заменить ссылки на DBClientConnection с DBClientBase (который является родителем для обоих DBClientConnection а также DBClientReplicaSet)

Последняя ловушка: если вы используете getLastError (), вы должны использовать его с целевым именем базы данных, например так:

connection.getLastError(std::string("DBName"));

в противном случае он всегда будет возвращать «команда не выполнена: необходимо войти в систему», как описано в этот билет JIRA.

У вас есть два способа сделать это:

Опция SlaveOK

Это позволяет вашим запросам на чтение направляться на вторичные серверы.

Это происходит в опциях запроса, которые находятся в конце параметров DBClientReplicaSet.query(), Варианты перечислены в Официальная документация Монго

Тот, который вы бы искали является mongo::QueryOption_SlaveOk, что позволит вам делать чтения на вторичных экземплярах.

Вот как вы должны вызывать query ();

connection.query("Database.Collection",
QUERY("_id" << id),
n,
m,
BSON("SomeField" << 1),
QueryOption_SlaveOk);

где n — количество документов, которые нужно вернуть (0, если вы не хотите устанавливать какие-либо ограничения), m — количество пропускаемых (по умолчанию 0), следующее поле — ваша проекция и последний вариант запроса.

Чтобы использовать несколько вариантов запроса, вы можете использовать bitwise or | как это :

connection.query("Database.Collection",
QUERY("_id" << id),
n,
m,
BSON("SomeField" << 1),
QueryOption_SlaveOk | QueryOption_NoCursorTimeout | QueryOption_Exhaust);

Опция Query :: readPref

У объекта запроса есть readPref метод, который устанавливает предпочтения чтения для специального запроса. Это должно быть вызвано для каждого запроса.

Вы можете передать различные аргументы для большего контроля. Они перечислены здесь.

Итак, вот что вы должны сделать (я не проверял это, потому что я не могу сейчас, но это должно работать просто отлично)

/* you should pass an array for the tags. Not sure if this is required.
Anyway, let's create an empty array using the builder. */

BSONArrayBuilder bab;

/* if any, add your tags here */

connection.query("Database.Collection",
QUERY("_id" << id).readPref(ReadPreference_SecondaryPreferred, bab.arr()),
n,
m,
BSON("SomeField" << 1),
QueryOption_NoCursorTimeout | QueryOption_Exhaust);

Заметка: если используется какой-либо параметр readPref, он должен переопределить параметр slaveOk.

Надеюсь, это помогло.

3

Другие решения

Пожалуйста, смотрите строка подключения документация для получения подробной информации о формате строки подключения.

(ссылки на коды ниже относятся к файлам 2.2.3)

Чтобы использовать строку подключения с драйвером C ++, вы должны использовать ConnectionString учебный класс. Вы сначала позвоните ConnectionString::parse статический метод со строкой соединения для получения ConnectionString объект. Вы тогда звоните ConnectionString::connect чтобы получить DBClientBase объект, который вы можете использовать для отправки запросов.

Что касается предпочтения чтения, в настоящий момент я не вижу способа установить предпочтение чтения в строке подключения для драйвера C ++, что исключало бы настройку для каждого подключения.

Тем не менее, реализация DBClientBase вернулся по телефону ConnectionString::parse со строкой, которая идентифицирует набор реплик, вернет вам экземпляр DBClientReplicaSet. Этот класс отличием $readPreference в запросах, так что вы можете установить предпочтение чтения для каждого запроса.

2

Поскольку текущие драйверы C ++ по-прежнему не принимают стандартные URI-адреса подключения mongodb, я открыл заявку:
https://jira.mongodb.org/browse/CXX-2
Пожалуйста, проголосуйте за это, чтобы помочь исправить это.

1

Похоже, что вы можете установить предпочтение чтения перед отправкой запроса на чтение с помощью метода readPref вашего объекта Query. Я еще не нашел способ установить предпочтение чтения для объекта коллекции mongo.

0
По вопросам рекламы [email protected]