Mongodb C ++ драйвер 3.0, не константные массивы

Я пытаюсь создать массив с содержанием вектора

using bsoncxx::builder::stream;
auto doc = document{};
doc << "foo"<< open_array;

for (auto i : v){
doc << open_document << "bar" << i << close_document ;
}
doc << close_array;

Я получаю следующее сообщение об ошибке:

error: no match for ‘operator<<’ (operand types are ‘bsoncxx::v0::builder::stream::document’ and ‘const bsoncxx::v0::builder::stream::open_document_type’)
doc << open_document << "bar" << i << close_document ;

Есть идеи, как это сделать?

1

Решение

Драйвер bson для C ++ 11 на самом деле скрывает немного больше сложности под API стилевого стиля, чем кажется на первый взгляд.

Проблема, с которой вы сталкиваетесь, заключается в том, что в каждом последующем выражении есть информация о типе, закодированная в выражении ‘<<‘, так что из вашего исходного примера вам нужно:

auto sz = 100;

// Note that we capture the return value of open_array
auto arr = doc << "foo" << open_array;

for (int32_t i=0; i < sz; i++)
arr << i;

arr << close_array;

Это потому, что open_array создает вложенный тип, который может принимать значения без ключей, в отличие от doc, для которого нужны пары ключ-значение.

Если вы хотите что-то более встроенное, вы можете использовать встроенное средство Callable, как в:

auto sz = 100;
builder::stream::document doc;
doc << "foo" << open_array <<
[&](array_context<> arr){
for (int32_t i = 0; i < sz; i++)
arr << i;
} // Note that we don't invoke the lambda
<< close_array;

Вызываемое средство работает с вещами, которые принимают:

single_context — записать одно значение в массив или как часть значения пары ключ-значение

key_context<> — написать любое количество пар ключ-значение

array_context<> — напишите любое количество значений

Смотрите src / bsoncxx / test / bson_builder.cpp для большего количества примеров

2

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

У меня та же проблема с потоковым компоновщиком.

using bsoncxx::builder::stream;
auto doc = document{};
doc << "foo"<< open_array
<< open_document
<< "bar1" << 1
<< "bar2" << 5
<< close_document
<< close_array;

Выше работает, но если вы хотите сделать следующее, это не работает

doc << "foo"<< open_array;
for (size_t i=0; i < sz; i++)
doc << i;

doc << close_array;

Я получаю ошибку ниже. Проблема в том, что такое поведение при использовании построителя потоков практически бесполезно. Возможно, это ошибка, или ребята из 10gen не закончили с этой частью API.

doc << closerror: no match for ‘operator<<’ (operand types are ‘bsoncxx::v0::builder::stream::document’ and ‘const bsoncxx::v0::builder::stream::open_document_type’) doc << open_document << "bar" << i << close_document ;e_array;
1