我正在使用Mongo 3.0版的Mongo C驱动程序1.1。libbson版本1.1。
我使用迭代器来查找文档中的某些字段。以下代码仅在MongoDB中“fielda”高于“fieldb”时有效。如果我更改了bson iter的订单,find返回false。

if(bson_iter_find(&iterator,"fieldA")){
    pintf("fieldA");
}
if(bson_iter_find(&iterator,"fieldB")){
    pintf("fieldB");
}

在libbson(0.4)的旧版本中,我可以使用bson_find()在文档中查找字段。在新的libbson库中有类似的东西吗?
链接到新的libbson库
https://api.mongodb.org/libbson/current/

最佳答案

要直接回答您的问题,您应该为针对数据进行的每个“新”查询调用bson iter_init(http://api.mongodb.org/libbson/current/bson_iter_init.html)。
假设您对bson对象有一个bson iter初始化调用。你只需要另一个。

   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并从该位置开始查找,可以避免该问题。
除非您确切知道自己在做什么并希望优化缓冲区周围的seeks,否则最好为每个查找重新初始化迭代器。

10-08 12:06