mongo c 驱动程序中 bson_iter_find 中的顺序是否重要

Does order matter in bson_iter_find in mongo c driver

我正在使用 mongo c 驱动程序 1.1 和 mongo 版本 3.0。利布森版本 1.1。 我正在使用迭代器来查找文档中的某些字段。以下代码仅在 "fieldA" 在 mongodb 中高于 "fieldB" 时有效。如果我更改顺序 bson_iter_find returns false。

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

在旧版本的 libbson(0.4) 中,我可以使用 bson_find() 来查找文档中的字段。我可以在新的 libbson 库中使用类似的东西吗?

Link 到新的 libbson 库 https://api.mongodb.org/libbson/current/

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

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