Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用mongodb C驱动程序获取mongodb数组中的元素数?_C_Arrays_Mongodb - Fatal编程技术网

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

如何使用mongodb C驱动程序获取mongodb数组中的元素数?,c,arrays,mongodb,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)

我用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的一个文档。文档的结构类似于此快照:

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

正如您所看到的,我尝试了bson_iter_阵列(&iter,&array_len,&array);但我想这不是我想要的。这是它的文档。这表示数组_len实际上是“缓冲区长度的一个位置”

因此,请有人帮助我们在遍历文档时获取mongodb数组的数组计数


谢谢,如果b指向数组,那么bson\u count\u键(bson\u t*b)将返回元素数。我想这需要在内部读取整个阵列。如果您只需要对内存预分配进行粗略估计,那么b->len会给出数组中的字节数,如果元素大小不变,您可以从中大致了解情况。我猜这与您从bson_iter_array()获得的数字相同。

这里缺少mongo C驱动程序文档,您必须仔细阅读代码。
bson\u iter\u阵列的定义如下所示。请注意,
*array\u 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);
   }
}

你找到答案了吗?我有同样的问题。我所能想到的就是在文档中迭代一次以计数元素,然后第二次处理它们。我猜bson格式不包括数组计数,所以这是内部无论如何都需要发生的事情。嗨,是的,你是对的,我们必须循环它。我认为C驱动很难看,特别是如果你和C驱动一起工作过的话。我回到了C#driver,因为我没有发现任何重大的性能提升。