0

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

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**。我尝试将指针(数据)类型转换为不同的类型,但值不正确。我该怎么做?

4

1 回答 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, &data) 访问数据:

数据具有下一种格式:

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
于 2017-02-03T09:30:16.913 回答