要直接回答您的问题,您应该为您针对数据进行的每个“新”查询 调用 bson_iter_init ( http://api.mongodb.org/libbson/current/bson_iter_init.html )。
大概您对 bson_t 对象有一个 bson_iter_init 调用。你只需要另一个。
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.
或者,如果您不想处理内部问题,只需使用组合命令 bson_iter_init_find ( http://api.mongodb.org/libbson/current/bson_iter_init_find.html )。
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.
如果您对原因感兴趣,我在 bsonsearch ( https://github.com/bauman/bsonsearch ) 库上工作并且有类似的问题。
在处理指针时要非常谨慎。libbson 中几乎所有内容都在操纵指向内存区域的指针。
排序的原因是因为您初始化了一次,当您调用 iter_find 时,libbson 会寻找 B 以定位 A。随后对 find B 的调用将寻找缓冲区的末尾并错过它。您可以通过将迭代器重新初始化回位置 0 并从那里开始搜索来避免该问题。
除非您确切知道自己在做什么并且想要优化围绕缓冲区的搜索,否则最好只为每个查找重新初始化迭代器。