2

我正在使用 mongo c 驱动程序 1.1 和 mongo 版本 3.0。利布森 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/

4

1 回答 1

2

要直接回答您的问题,您应该为您针对数据进行的每个“新”查询 调用 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 并从那里开始搜索来避免该问题。

除非您确切知道自己在做什么并且想要优化围绕缓冲区的搜索,否则最好只为每个查找重新初始化迭代器。

于 2016-02-02T21:46:57.623 回答