Класс BSONArrayBuilder в драйвере MongoDB C ++ API позволяет создавать массивы BSON, например.
BSONArrayBuilder ba;
ba.append("foo");
ba.append("bar");
...
connection->query("col", BSON("x" << BSON("$in" << ba.arr())));
выполнит запрос, равный следующему, в оболочке mongo:
db.col.find({"x": {"$in": [ "foo", "bar" ] }})
Однако мне нужно сделать запрос, основанный на регулярном выражении, а не на строках, следующим образом (это работает в оболочке mongo):
db.col.find({"x": {"$in": [ /^foo/, /^bar/ ] }})
Как я могу построить этот массив с помощью драйвера C ++? Обратите внимание, что BSONObjBuilder класс имеет appendRegex()
метод, который не включен в класс BSONArrayBuilder
Любой обходной путь или указатель на информацию об этой проблеме высоко ценится. Спасибо!
Недавно мы добавили поддержку для этого в устаревшем выпуске драйвера MongoDB C ++, он будет в следующем выпуске кандидата на 1.0.0:
Обходной путь, который я проверил, это работает — создать строку JSON, а затем проанализировать ее с помощью метода fromjson ():
std::string s = "{\"x\": {\"$in\": [ /^foo/, /^bar/ ] }";
BSON b = fromjson(s);
connection->query("col", b);
Однако мне интересно, если использование метода fromjson () слишком дорого (из-за синтаксического анализа строк) по сравнению с прямым составом объектов BSON. Любое понимание этого, пожалуйста?