Кажется, что драйверы c ++ не принимают формат URI соединения mongodb.
Там нет документации о том, как я должен создать строку подключения, как вы думаете?
Мне нужно подключиться к реплике с 3 серверами и установить параметры readPreference.
Пока проблемы не объяснены в ответ @ 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.
У вас есть два способа сделать это:
Это позволяет вашим запросам на чтение направляться на вторичные серверы.
Это происходит в опциях запроса, которые находятся в конце параметров 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);
У объекта запроса есть 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.
Надеюсь, это помогло.
Пожалуйста, смотрите строка подключения документация для получения подробной информации о формате строки подключения.
(ссылки на коды ниже относятся к файлам 2.2.3)
Чтобы использовать строку подключения с драйвером C ++, вы должны использовать ConnectionString
учебный класс. Вы сначала позвоните ConnectionString::parse
статический метод со строкой соединения для получения ConnectionString
объект. Вы тогда звоните ConnectionString::connect
чтобы получить DBClientBase объект, который вы можете использовать для отправки запросов.
Что касается предпочтения чтения, в настоящий момент я не вижу способа установить предпочтение чтения в строке подключения для драйвера C ++, что исключало бы настройку для каждого подключения.
Тем не менее, реализация DBClientBase
вернулся по телефону ConnectionString::parse
со строкой, которая идентифицирует набор реплик, вернет вам экземпляр DBClientReplicaSet. Этот класс отличием $readPreference
в запросах, так что вы можете установить предпочтение чтения для каждого запроса.
Поскольку текущие драйверы C ++ по-прежнему не принимают стандартные URI-адреса подключения mongodb, я открыл заявку:
https://jira.mongodb.org/browse/CXX-2
Пожалуйста, проголосуйте за это, чтобы помочь исправить это.
Похоже, что вы можете установить предпочтение чтения перед отправкой запроса на чтение с помощью метода readPref вашего объекта Query. Я еще не нашел способ установить предпочтение чтения для объекта коллекции mongo.