订单在mongo c驱动程序中的bson_iter_find中是否重要

时间:2016-01-13 13:09:52

标签: c mongodb bson mongo-c-driver

我正在使用mongo c驱动程序1.1和mongo 3.0版。 Libbson 1.1版。 我正在使用迭代器来查找文档中的某些字段。以下代码仅在“fieldA”位于mongodb中的“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()来查找doc中的字段。我可以在新的libbson库中使用类似的东西吗?

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

1 个答案:

答案 0 :(得分:2)

要直接回答你的问题,你应该为每一个" 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中几乎所有内容都在操纵指向内存区域的指针。

订购maters的原因是因为你初始化了一次,当你调用iter_find时,libbson会寻找过去的B找到A 。随后的查找B的调用将寻找缓冲区的末尾并错过它。通过将迭代器重新初始化回位置0并从那里开始搜索来避免这个问题。

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