我正在使用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/
答案 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并从那里开始搜索来避免这个问题。
除非您确切知道自己正在做什么并希望优化缓冲区周围的搜索,否则最好只为每个查找重新初始化迭代器。