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;}
阅读全文
0 0
- MongoDB笔记四: C Driver
- Mongodb c Driver 编译
- mongodb c driver
- MongoDB c++ driver(四)
- Mongodb c Driver 使用实例
- MongoDb C#Driver 模糊查询
- Mongodb 安装c++driver Ubuntu
- mongoDB C Driver使用介绍
- MongoDB笔记一,Win10上使用C Driver访问MongoDB Server
- MongoDB学习笔记<四>
- mongoDB学习笔记四
- mongodb C driver的异步查询
- Mongodb空间查询之C++driver
- 在Windows上编译MongoDB C Driver
- mongodb c driver执行mongo_run_command求sum
- 在Windows上编译MongoDB C Driver
- 在windows下编译mongodb c driver
- mongodb c++driver连接数据错误
- Day015
- Mysql建表与索引使用规范整理
- iOS开发网络篇 一一 复杂的JSON解析-数据显示
- 送书福利| Python 完全自学手册
- [论文笔记] CRNN(Convolutional Recurrent Neural Network)_2015 学习笔记
- MongoDB笔记四: C Driver
- 给深度学习入门者的Python快速教程
- jstl <fmt:formatNumber>标签
- idea weblogic maven 遇到异常
- Centos7安装Tensorflow
- valid 与 same的卷积方式
- YTKNetwork在iOS8的系统下出现闪退问题处理办法
- Linux系统下如何查看及修改文件读写权限
- EventBus 3.0进阶:源码及其设计模式 完全解析