2016-07-07 67 views
0

我有一个mongo集合中的文档,如下所示: {“f”:[283,180,284],“l”:[“1”,“29”] } 我正在使用mongoDB c驱动程序来获取这些文件并对这些文件执行一些操作>我想将元素“f”恢复为整数数组,并将元素“l”恢复为两个多维char数组。使用MongoDb c驱动程序从bson中提取数组

while (mongoc_cursor_next (cursor, &doc)) 
{ 
    bson_iter_t it; 
    bson_iter_init(&it, doc); 

    while (bson_iter_next(&it)) 
    { 
     const char * key=bson_iter_key(&it); 
     bson_type_t type=bson_iter_type(&it); 
     const uint8_t *data = NULL; 
     uint32_t len = 0; 
     bson_iter_array (&it, &len, &data); 

    } 

} 

我无法弄清楚如何可以提取“f”到int *和“l”char **。我试图将指针(数据)转换为不同的类型,但值不正确。我该如何解决它?

回答

1

有两种方法。 月1日,你可以将其转换为BSON,并提取值的键“1”,“2”等:

bson_t * doc = /*your bson doc*/; 
bson_iter_t iter; 
bson_iter_init(&iter, doc); 

// requesting for f 
bson_iter_find(&iter, "f"); 

const ui8 * data = NULL; 
uint32_t len = 0; 
bson_iter_array(&iter, &len, &data); 

bson_t * fSubArray = bson_new_from_data(data, len); 

bson_iter_t fIter; 

bson_iter_init(&fIter, fSubArray); 

bson_iter_find(&fIter, "0"); 
bson_iter_int32(&fIter) == 283; 

bson_iter_find(&fIter, "1"); 
bson_iter_int32(&fIter) == 180; 

bson_iter_find(&fIter, "2"); 
bson_iter_int32(&fIter) == 284; 

// requesting for l 
bson_iter_find(&iter, "l"); 

const ui8 * data = NULL; 
uint32_t len = 0; 
bson_iter_array(&iter, &len, &data); 

bson_t * fSubArray = bson_new_from_data(data, len); 

bson_iter_t fIter; 

bson_iter_init(&fIter, fSubArray); 

bson_iter_find(&fIter, "0"); 
strcmp(bson_iter_utf8(&fIter), "1") == 0; 

bson_iter_find(&fIter, "1"); 
strcmp(bson_iter_utf8(&fIter), "29") == 0; 

此外,mongoc推荐使用bson_uint32_to_string功能快速字符串为int转换。

第二可以直接查看在bson_iter_array数据(& ITER,& LEN,&数据)时,如果第一方法的性能比较不明确:

数据具有下一格式:

total bytes in data | bson type | string index   | 4 for int32, 1 for char, etc.| bson type | ... | end of data 
4 bytes    | 1 byte | null-terminated string | sizeof(element) bytes  | 1 byte | ... | \0 

所以,如果你知道你的数据的大小,你可以直接访问它。但你应该考虑,数据有净字节顺序。

例如,如果我们知道,这是阵列[INT32(2),Int64的(4)],数据将是:

4 bytes    | 1 byte   | null-terminated string | sizeof(int32) bytes  | 1 byte   | 1 byte | sizeof(int64) bytes | \0 
23 0 0 0   | 16    | 48 0     | 2 0 0 0     | 18    | 49 0 | 4 0 0 0 0 0 0 0  | 0 
totaly 23 bytes  | BSON_TYPE_INT32 | "0\0"     | 2      | BSON_TYPE_INT64 | "1\0" | 4     | end 
相关问题