2012-05-04 22 views
5

Ví dụ, nếu tôi làm điều này trong vỏLàm thế nào để lưu mảng mongodb vào vector bằng cách sử dụng trình điều khiển C++?

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

Sau đó, tôi muốn có được arr trong chương trình của tôi C++.

Sau khi tôi đã nhận BSONObj tôi có thể lấy name với

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

nơi p là một đối tượng BSON.

Nhưng cách đúng để lấy các phần tử từ mảng và lưu chúng thành tiêu chuẩn :: vector?

CHỈNH SỬA:

Sau khi tìm hiểu thêm, tôi tìm thấy tài liệu BSONElement doxygen và thực hiện việc này.

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

Nhưng tôi vẫn không chắc liệu đó có phải là cách phù hợp hay không.

Trả lời

6

Hai cách khác:

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

hoặc

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

Ngoài ra, bạn chỉ có thể rời khỏi đầu ra như một vector<BSONElement> và sử dụng chúng trực tiếp, nhưng sau đó bạn sẽ cần phải chắc chắn rằng BSONObj sẽ sống lâu hơn vectơ.

+0

tôi hy vọng hình thức đầu tiên sẽ tốt hơn khi tập hợp các mục tải lớn, vì việc triển khai có cơ hội gọi 'boost :: vector <> :: reserve()' với kích thước cuối cùng của vectơ – lurscher

+0

Thực tế là không. Do cách định dạng BSON được bố trí, không có cách nào để biết có bao nhiêu phần tử trong một đối tượng/mảng mà không lặp lại nó. Nếu bạn nhìn vào việc thực hiện các vals, bạn sẽ thấy rằng nó gần như giống hệt với phiên bản thứ hai. Sự khác biệt có, sẽ có nhiều khả năng để làm cho nó (hơi) chậm hơn trong thực tế, nhưng không đủ để quan trọng. – mstearn

+0

ồ, điều đó quá tệ. – lurscher

Các vấn đề liên quan