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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With