để trực tiếp trả lời câu hỏi của mình, bạn nên gọi bson_iter_init ( http://api.mongodb. org / libbson / current / bson_iter_init.html ) cho mọi truy vấn "mới" mà bạn đang thực hiện dựa trên dữ liệu.
Có lẽ bạn có một lệnh gọi bson_iter_init trên một đối tượng bson_t. Bạn chỉ cần một cái khác.
bson_iter_t iterator1;
bson_iter_t iterator2;
if (bson_iter_init (&iterator1, doc) &&
bson_iter_find (&iterator1, "fieldA") ) {
//Do something with fieldA
}
if (bson_iter_init (&iterator2, doc) &&
bson_iter_find (&iterator2, "fieldB") ) {
//Do something with fieldB
}
bson_free(doc); //DONT FORGET TO DESTROY THE BSON_T object at the end.
hoặc chỉ sử dụng lệnh kết hợp bson_iter_init_find ( http://api.mongodb.org/ libbson / current / bson_iter_init_find.html ) nếu bạn không muốn giao dịch với nội bộ.
bson_iter_t iterator1;
bson_iter_t iterator2;
if (bson_iter_init_find (&iterator1, doc, "fieldA") ) {
//Do something with fieldA
}
if (bson_iter_init_find (&iterator2, doc,"fieldB") ) {
//Do something with fieldB
}
bson_free(doc); //DONT FORGET TO DESTROY THE BSON_T object at the end.
Nếu bạn quan tâm đến lý do tại sao, tôi làm việc trên bsonsearch ( https://github.com/bauman/bsonsearch ) thư viện và gặp sự cố tương tự.
Hãy rất thận trọng về cách bạn xử lý các con trỏ. Gần như mọi thứ ẩn trong libbson đều đang thao túng con trỏ đến một vùng trong bộ nhớ.
Lý do đặt hàng maters là bởi vì bạn đã khởi tạo một lần, khi bạn gọi iter_find, libbson sẽ tìm kiếm qua B để xác định vị trí A . Lệnh gọi tìm B tiếp theo sẽ tìm đến cuối vùng đệm và bỏ lỡ nó. Bạn tránh được vấn đề đó bằng cách khởi động lại trình vòng lặp trở lại vị trí 0 và bắt đầu tìm kiếm từ đó.
Trừ khi bạn biết chính xác mình đang làm gì và muốn tối ưu hóa các tìm kiếm xung quanh bộ đệm, có lẽ tốt nhất bạn chỉ nên khởi động lại trình lặp cho mỗi lần tìm thấy.