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

我正在使用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/

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

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

Interesting Posts