如何使用Mongodb C驱动程序获取mongodb数组中的元素数量?

时间:2015-06-19 18:42:31

标签: c arrays mongodb

我有以下用C编写的代码,用于使用C mongodb驱动程序。

  else if (0 == strcmp(key, "Records")){
            printf("-------------Records-------------\n");
            if (BSON_ITER_HOLDS_ARRAY(&iter)) {
                bson_iter_array(&iter, &array_len,&array);
                bson_iter_recurse(&iter, &child);
                while (bson_iter_next(&child)) {
                    key = bson_iter_key(&child);
                    if (BSON_ITER_HOLDS_DOCUMENT(&child)){
                        ReadRecords(&child);
                    }
                }
            }
        }

基本上我正在尝试从mongodb读取文档。 docuemnt的结构就像这个快照:http://1drv.ms/1BAXAOx

但是对于我的api pupose我想知道数组的大小,然后我开始迭代每个元素并以我的格式使用它。

如你所见,我曾尝试过bson_iter_array(& iter,& array_len,& array);但我认为这不是我想要的。以下是http://api.mongodb.org/libbson/current/bson_iter_array.html的文档。其中说array_len实际上是#34;缓冲区长度的位置"。

所以有人可以帮助我们在迭代文档的同时获取mongodb数组的数组计数。

由于

2 个答案:

答案 0 :(得分:2)

如果b指向数组,

bson_count_keys(bson_t * b)将返回元素数。我猜想需要在内部读取整个数组。如果你只需要对内存预分配进行粗略估计,那么b-> len给出数组中的字节数,如果元素大小是常量的话,你可以从中得到一个粗略的想法。我猜这是你从bson_iter_array()获得的数字。

答案 1 :(得分:0)

mongo C驱动程序文档在这里有点缺乏,并强迫你挖掘代码。 bson_iter_array的定义如下所示。请注意,*array_len**array是输出。

void
bson_iter_array (const bson_iter_t  *iter,      /* IN */
                 uint32_t           *array_len, /* OUT */
                 const uint8_t     **array)     /* OUT */
{
   bson_return_if_fail (iter);
   bson_return_if_fail (array_len);
   bson_return_if_fail (array);

   *array = NULL;
   *array_len = 0;

   if (ITER_TYPE (iter) == BSON_TYPE_ARRAY) {
      memcpy (array_len, (iter->raw + iter->d1), sizeof (*array_len));
      *array_len = BSON_UINT32_FROM_LE (*array_len);
      *array = (iter->raw + iter->d1);
   }
}