How to save mongodb array into vector using c++ driver?
bson, c++, mongo-cxx-driver, mongodb
Solution
Two other ways:
// this way is easy but requires exact type match (no int64->int32 conversion)
std::vector<int> ints;
p.getObjectField("arr").vals(ints); // skips non int values
p.getObjectField("arr").Vals(ints); // asserts on non int values
or
// this way is more common and does the conversion between numeric types
vector<int> v;
BSONObjIterator fields (p.getObjectField("arr"));
while(fields.more()) {
v.push_back(fields.next().numberInt());
}
//same as above but using BSONForEach macro
BSONForEach(e, p.getObjectField("arr")) {
v.push_back(e.numberInt());
}
Alternatively, you could just leave the output as a `vector<BSONElement>` and use them directly, but then you will need to be sure that the BSONObj will outlive the vector.
Problem
For example, if I do this in shell ``` > db.numbers.save( { name: "fibonacci", arr: [0, 1, 1, 2, 3, 5, 8, 13, 21] } ) ``` Then i want to get `arr` in my c++ program. After i got BSONObj i can get `name` with ``` std::string name = p.getStringField("name"); ``` where `p` is a BSON object. But what is the right way to get elements from array and save them into std::vector? EDIT: After some more research i found BSONElement doxygen documentation and made this. ``` std::vector<int> arr; std::vector<BSONElement> v = p.getField("arr").Array(); for(std::vector<BSONElement>::iterator it = v.begin(); it != v.end(); ++it) arr.push_back(it->numberInt()); ``` But im still not sure if it is the right way.