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.
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
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
ồ, điều đó quá tệ. – lurscher