2012-05-04 12 views
5

Na przykład, jeśli mogę to zrobić w skorupkachJak zapisać tablicę mongodów do wektora za pomocą sterownika C++?

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

Następnie chcę uzyskać arr w moim programie C++.

Po mam BSONObj mogę dostać name z

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

gdzie p jest obiektem BSON.

Ale jaki jest właściwy sposób na pobranie elementów z tablicy i zapisanie ich w std :: vector?

EDIT:

Po kilku dalszych badań znalazłem dokumentację BSONElement Doxygen i uczynił to.

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

Ale nadal nie jestem pewien, czy jest to właściwa droga.

Odpowiedz

6

dwa inne sposoby:

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

lub

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

Alternatywnie, można po prostu zostawić wyjście jako vector<BSONElement> i używać ich bezpośrednio, ale wtedy trzeba będzie mieć pewność, że BSONObj przeżyje wektor.

+0

Mam nadzieję, że pierwsza forma jest o wiele lepsza, ponieważ zbiór elementów do załadowania staje się duży, ponieważ implementacja ma szansę na wywołanie 'boost :: wektor <> :: reserve()' z ostatecznym rozmiarem wektora – lurscher

+0

W rzeczywistości tak nie jest. Ze względu na sposób, w jaki rozkłada się format BSON, nie ma sposobu, aby wiedzieć, ile elementów znajduje się w obiekcie/macierze bez wykonywania iteracji. Jeśli spojrzysz na implementację vals, zobaczysz, że jest prawie identyczny z drugą wersją. Jakie różnice istnieją, bardziej prawdopodobne jest, że będzie (nieco) wolniej, ale nie na tyle, aby to miało znaczenie. – mstearn

+0

oh, to źle. – lurscher

Powiązane problemy