Search code examples
c++mongodbbsonmongo-cxx-driver

How to save mongodb array into vector using c++ driver?


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.


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.