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
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
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
oh, eso es muy malo. – lurscher