MongoDB笔记四: C Driver

来源:互联网 发布:linux查看oracle版本 编辑:程序博客网 时间:2024/05/19 09:38

Author: kagula

Date: 2017-12-18

测试环境:VS2017 Update5, MongoDB C Driver 1.8.1

这里直接extract项目中的代码,共两部份:

第一部份,依赖的函数

void string2uuid(const char *src32, unsigned char dest[16]){unsigned int index;for (size_t i = 0, j = 0; i < 16 * 2; i += 2, j++){unsigned char high;if (src32[i] <= '9')high = (src32[i] - 0x30);else if (src32[i] <= 'F')high = (src32[i] - 0x41) + 10;else if (src32[i] <= 'f')high = (src32[i] - 0x61) + 10;high = high << 4;index = i + 1;if (src32[index] <= '9')dest[j] = (src32[index] - 0x30);else if (src32[index] <= 'F')dest[j] = (src32[index] - 0x41) + 10;else if (src32[index] <= 'f')dest[j] = (src32[index] - 0x61) + 10;dest[j] = dest[j] + high;}}void hex2string(const uint8_t *src, const unsigned srcLen,std::string &dest){std::stringstream ss;for (size_t i = 0; i < srcLen; i++){if (i == 4 || i == 6 || i == 8 || i == 10){ss << "-";}ss << std::setw(2) << std::setfill('0') << std::hex << (short)(src[i]);}dest = ss.str();//LUUID("4ce75991-0ac5-4198-b817-67059cb6b6b5")}void convertBSON_SUBTYPE_UUID_DEPRECATED2String(bson_iter_t &iter,const char *key,std::string &out){if (bson_iter_find(&iter, key) && BSON_ITER_HOLDS_BINARY(&iter)){const uint8_t *binary = NULL;bson_subtype_t subtype = BSON_SUBTYPE_UUID_DEPRECATED;uint32_t binary_len = 0;bson_iter_binary(&iter, &subtype, &binary_len, &binary);hex2string(binary, binary_len, out);}//ifelse{out.clear();}}void convertBSON_SUBTYPE_UUID_DEPRECATED_Array2String(bson_iter_t &iter, const char *key, bson_t *record){bson_iter_t sub_iter;if (bson_iter_find(&iter, key) && BSON_ITER_HOLDS_ARRAY(&iter) &&bson_iter_recurse(&iter, &sub_iter)){bson_t *parents = bson_new();char arrayIndex[16] = { 0 };unsigned int nArrayIndex = 0;BSON_APPEND_ARRAY_BEGIN(record, key, parents);while (bson_iter_next(&sub_iter)) {//printf("Found key \"%s\" in sub document.\n", bson_iter_key(&sub_iter));if (BSON_ITER_HOLDS_BINARY(&sub_iter)){std::string element;bson_subtype_t subtype = BSON_SUBTYPE_UUID_DEPRECATED;uint32_t binary_len = 0;const uint8_t *binary = NULL;bson_iter_binary(&sub_iter, &subtype, &binary_len, &binary);hex2string(binary, binary_len, element);sprintf_s(arrayIndex, "%d", nArrayIndex);BSON_APPEND_UTF8(parents, arrayIndex, element.c_str());nArrayIndex++;}}bson_append_array_end(record, parents);bson_destroy(parents);}//if}

第二部份:示例代码

int CMongoDBWrapper::queryObjByUID(const char* dbName, const char* collectionPrefix, const char* collectionSuffix, const char* uid, std::string &outJSON){//check argumentsif (uid == nullptr || strlen(uid) != 32){return -1;}//using namespace std;char collectionName[512];sprintf_s(collectionName, "%s.%s", collectionPrefix, collectionSuffix);mongoc_collection_t * collection = mongoc_client_get_collection(m_client, dbName, collectionName);bson_t *bt_filter = bson_new();//BSON_APPEND_UTF8(bt_filter, "type", "meta");//能搜到type属性为meta的记录uint8_t uuid[16];string2uuid(uid, uuid);BSON_APPEND_BINARY(bt_filter, "_id", BSON_SUBTYPE_UUID_DEPRECATED, uuid, 16);//16字节的UUID//BSON_SUBTYPE_UUIDmongoc_cursor_t *cursor = mongoc_collection_find_with_opts(collection, bt_filter, NULL, NULL);const bson_t *bt_result;//通过mongoc_cursor_next可以把结果集中的所有数据取出来,这里只要取一条就够了。  if (mongoc_cursor_next(cursor, &bt_result)){//char *str = bson_as_canonical_extended_json(bt_result, NULL);  //char *str = bson_as_json(bt_result, NULL);//这种方式取出结果_id字段显示为Base64形式.//outJSON = str;//bson_free(str);////bson_t *record = bson_copy(bt_result);bson_t record;bson_init(&record);bson_copy_to_excluding_noinit(bt_result, &record, "_id", "parents", "shared_id", NULL);//虽然bson里只有一个对象也需要iterbson_iter_t iter;bson_iter_init(&iter, bt_result);//_id字段转为可读.string uuid;convertBSON_SUBTYPE_UUID_DEPRECATED2String(iter, "_id", uuid);BSON_APPEND_UTF8(&record, "_id", uuid.c_str());//parents数组转为可读convertBSON_SUBTYPE_UUID_DEPRECATED_Array2String(iter,"parents", &record);//shared_it转为可读string shared_id;convertBSON_SUBTYPE_UUID_DEPRECATED2String(iter, "shared_id", shared_id);BSON_APPEND_UTF8(&record, "shared_id", shared_id.c_str());//convert to JSON stringchar *str = bson_as_json(&record, NULL);outJSON = str;bson_free(str);bson_destroy(&record);}//ifelse{outJSON.clear();}mongoc_cursor_destroy(cursor);mongoc_collection_destroy(collection);bson_destroy(bt_filter);return 0;}


原创粉丝点击