我有以下用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数组的数组计数。
由于
答案 0 :(得分:2)
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);
}
}