2012-05-04 24 views
5

Por ejemplo, si hago esto con cáscara¿Cómo guardar array mongodb en vector usando el controlador C++?

> db.numbers.save({ name: "fibonacci", arr: [0, 1, 1, 2, 3, 5, 8, 13, 21] }) 

entonces quiero conseguir arr en mi programa C++.

después de que consiguiera BSONObj puedo conseguir name con

std::string name = p.getStringField("name"); 

donde p es un objeto BSON.

Pero, ¿cuál es la forma correcta de obtener elementos de la matriz y guardarlos en std :: vector?

EDIT:

Después de un poco más de investigación he encontrado documentación doxygen BSONElement e hice esto.

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()); 

Pero todavía no estoy seguro si es el camino correcto. otros

Respuesta

6

dos maneras:

// 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 

o

// 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()); 
} 

Como alternativa, puede simplemente dejar la salida como una vector<BSONElement> y utilizarlos directamente, pero entonces tendrá que estar seguro de que el BSONObj sobrevivirá al vector.

+0

espero que la primera forma sea mucho mejor ya que el conjunto de elementos para cargar se vuelve grande, ya que la implementación tiene la oportunidad de llamar a 'boost :: vector <> :: reserve()' con el tamaño final del vector – lurscher

+0

En realidad, no es así. Debido a la forma en que se presenta el formato BSON, no hay forma de saber cuántos elementos hay en un objeto/matriz sin iterar sobre él. Si observas la implementación de vals, verás que es casi idéntica a la segunda versión. Las diferencias que existen son más propensas a hacer que (de hecho) sean más lentas, de hecho, pero no lo suficiente como para importar. – mstearn

+0

oh, eso es muy malo. – lurscher

Cuestiones relacionadas