最新要闻
- iQOO 11性能猛挤牙膏:130万跑分、内存秒变24GB
- 一块屏幕同时两种刷新率!iQOO 11支持LTPO4.0+分区高刷
- 最新快讯!领124元神券!蒙牛Nopa燃型低脂纤维奶昔牛乳大促:10瓶35元
- 《阿凡达2》首映后被批了 影评人:剧情没第一部好看!全片冗长、台词沉闷
- 片长190分钟超130万人想看!《阿凡达2:水之道》总票房突破3000万
- 最新消息:Nature最新:熊去氧胆酸可预防新冠、不怕病毒变异
- 世界热门:骁龙8 Gen2价格屠夫!moto X40系列定档12月15日
- 环球讯息:南京一地铁口被大量共享单车堵死 密密麻麻场面壮观:大家应文明骑行规范停车
- 今日最新!家长注意!羽绒服会让儿童安全座椅失效:有致命危险
- 全球实时:新能源车爆发 锂矿价格翻10倍 宁德宜春等多城提出打造“锂都”
- 资讯:降多少你会买?消息称RTX 4080要降价几千 首发用户将受伤 会有赔偿吗?
- 走后门上班?马斯克两位堂兄弟入职推特 成全职员工
- 天天热点!一张照片立即变视频主角 “AI换脸”惹上事 女子获赔5000元
- 东北零下20度 男子雪碧放车里一晚被冻炸:按键都不好使了
- 环球视点!厉害!韩国所有人将至少年轻1-2岁:网友看完方法直呼意外
- 天天微资讯!30年老司机成功预判避免车祸 当事人:本能反应 预感到它们刹不住
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
视点!libmongoc库和libbson库的使用
libmongoc库和libbson库的使用
学习一项知识,最好的方式是查看官方说明书。
前言
工作和学习过程中,需要用到数据库,这里挑选了MongoDB 非关系型数据库。使用数据库,肯定离不开数据库的 增、删、改、查。
MongoDB自带了客户端程序:mongosh.exe
,基本可以满足用户所有的操作需要。但是进行程序二次开发,我们还是需要使用 MongoDB Client Library.
(资料图片仅供参考)
本文主要介绍 libmongoc库和 libbson库的常用函数,以及使用过程中的注意事项
一、libmongoc库和libbson库的介绍
官网介绍:
A Cross Platform MongoDB Client Library for CThe MongoDB C Driver, also known as “libmongoc”, is a library for using MongoDB from C applications, and for writing MongoDB drivers in higher-level languages.It depends on libbson to generate and parse BSON documents, the native data format of MongoDB.
MongoDB的数据存储格式:bson,那么就需要libbson库。
数据库原始数据:
{"id":1001,"name":"ZhangSan","age":18,"sex":"male","Chinese":93.0,"Math":100.0,"English":80.0}{"id":1002,"name":"LiSi","age":18,"sex":"male","Chinese":100.0,"Math":60.0,"English":80.0}{"id":1003,"name":"WangWu","age":19,"sex":"male","Chinese":90.0,"Math":100.0,"English":90.0}{"id":1004,"name":"ZhaoLiu","age":19,"sex":"male","Chinese":95.0,"Math":70.0,"English":80.0}{"id":1005,"name":"XiaoLi","age":18,"sex":"female","Chinese":100.0,"Math":100.0,"English":80.0}
二、libmongoc库的使用
数据库的CRUD(即create、read、update、delete)操作
2-1 create(增操作)
以json格式传入,在表中创建一条bson。
实现代码
#include static int lib_collection_create_document(const char *uri_string, const char *database_name, const char *collection_name, const char *json){mongoc_client_t *client = NULL;mongoc_collection_t *collection = NULL;bson_error_t error;bson_oid_t oid;bson_t *doc = NULL;bson_t *json_d = NULL;int result = 0;/* create mongoc client instace */client = mongoc_client_new(uri_string);/* create collection instace */collection = mongoc_client_get_collection(client, database_name, collection_name);/* create bson instace */doc = bson_new();/* init bson oid.* oid is primary key in collection*/bson_oid_init(&oid, NULL);/* bson oid append bson_t */BSON_APPEND_OID(doc, "_id", &oid);json_d = bson_new_from_json((unsigned char *)json, -1, &error);if (!json_d){fprintf(stderr, "%s\n", error.message);result = -1;}bson_concat(doc, json_d);bson_destroy(json_d);if (!mongoc_collection_insert_one(collection, doc, NULL, NULL, &error)){fprintf(stderr, "%s\n", error.message);result = -2;}/* free bson_t memory */bson_destroy(doc);/* free mongoc_collection_t */mongoc_collection_destroy(collection);/* free mongoc_client_t */mongoc_client_destroy(client);return result;}int main(int argc, char *argv[]){mongoc_init();const char *uri_string = "mongodb://10.8.198.55:27017";const char *database = "event_database";const char *collection = "student_coll";// add a json to collectionchar json[500] = {"{\"id\":1006,\"name\":\"XiaoHong\",\"age\":24,\"sex\":\"female\",\"Chinese\":74.0,\"Math\":85.0,\"English\":81.0}"};if (0 == lib_collection_create_document(uri_string, database, collection, json)){printf("Create successful : %s\n", json);}mongoc_cleanup();return 0;}
运行结果:
2-2 read(查操作)
在表中查找符合条件的document,通过数组返回
实现代码:
#include static int lib_collection_read_document(const char *uri_string, const char *database_name, const char *collection_name, const char *json_opts,char doc_list_arr[][300], int *num_of_docs){mongoc_client_t *client = NULL;mongoc_collection_t *collection = NULL;mongoc_cursor_t *cursor = NULL;bson_error_t error;const bson_t *doc = NULL;bson_t *query = NULL;bson_t *json_d = NULL;char *str = NULL;int result = 0;client = mongoc_client_new(uri_string);collection = mongoc_client_get_collection(client, database_name, collection_name);query = bson_new();json_d = bson_new_from_json((unsigned char *)json_opts, -1, &error);if (!json_d){fprintf(stderr, "%s\n", error.message);result = -1;}bson_concat(query, json_d);bson_destroy(json_d);cursor = mongoc_collection_find_with_opts(collection, query, NULL, NULL);while (mongoc_cursor_next(cursor, &doc)){//str = bson_as_canonical_extended_json(doc, NULL);//str = bson_as_relaxed_extended_json(doc, NULL);str = bson_as_json(doc, NULL);sprintf(doc_list_arr[*num_of_docs], "%s", str);(*num_of_docs)++;bson_free(str);}bson_destroy(query);mongoc_cursor_destroy(cursor);mongoc_collection_destroy(collection);mongoc_client_destroy(client);return result;}int main(int argc, char *argv[]){mongoc_init();const char *uri_string = "mongodb://10.8.198.55:27017";const char *database = "event_database";const char *collection = "student_coll";/* read jsons from collection with options */char json_opts[300] = {"{\"age\":18,\"sex\":\"male\"}"};char doc_list_arr[100][300] = {0};int num_of_docs = 0;lib_collection_read_document(uri_string, database, collection, json_opts, doc_list_arr, &num_of_docs);for (int i = 0; i < num_of_docs; i++){printf("%s\n", doc_list_arr[i]);}mongoc_cleanup();return 0;}
运行结果:
2-3 update(改操作)
在表中查找指定的json,符合条件的json进行修改注意:这里修改值的类型为string
实现代码:
#include #include static int lib_collection_update_document(const char *uri_string, const char *database_name, const char *collection_name, const char *json_opts, const char *key, const char *value_string){mongoc_collection_t *collection = NULL;mongoc_client_t *client = NULL;bson_error_t error;mongoc_cursor_t *cursor = NULL;const bson_t *doc = NULL;bson_t *update = NULL;bson_t *query = NULL;int result = 0;client = mongoc_client_new(uri_string);collection = mongoc_client_get_collection(client, database_name, collection_name);update = BCON_NEW("$set","{",key,BCON_UTF8(value_string),"}");query = bson_new_from_json((unsigned char *)json_opts, -1, &error);if (!query){fprintf(stderr, "%s\n", error.message);result = -1;}cursor = mongoc_collection_find_with_opts(collection, query, NULL, NULL);while (mongoc_cursor_next(cursor, &doc)){if (!mongoc_collection_update_one(collection, doc, update, NULL, NULL, &error)){fprintf(stderr, "%s\n", error.message);result = -2;break;}}bson_destroy(query);bson_destroy(update);mongoc_cursor_destroy(cursor);mongoc_collection_destroy(collection);mongoc_client_destroy(client);return result;}int main(int argc, char *argv[]){mongoc_init();const char *uri_string = "mongodb://10.8.198.55:27017";const char *database = "event_database";const char *collection = "student_coll";/* update documents from collection wiht options */char json_opts[300] = { "{\"id\":1006}" };const char *key = "name";const char *value = "XiaoHe";if (0 == lib_collection_update_document(uri_string, database, collection, json_opts, key, value)){printf("Update successful\n");}mongoc_cleanup();return 0;}
运行结果:
2-4 delete(删操作)
在表中查找指定的json,符合条件的json进行删除
实现代码:
#include #include static int lib_collection_delete_document(const char *uri_string, const char *database_name, const char *collection_name, const char *json_opts){mongoc_client_t *client = NULL;mongoc_collection_t *collection = NULL;mongoc_cursor_t *cursor = NULL;bson_error_t error;const bson_t *doc = NULL;bson_t *query = NULL;int result = 0;client = mongoc_client_new(uri_string);collection = mongoc_client_get_collection(client, database_name, collection_name);query = bson_new_from_json((unsigned char *)json_opts, -1, &error);if (!query){fprintf(stderr, "%s\n", error.message);result = -1;}cursor = mongoc_collection_find_with_opts(collection, query, NULL, NULL);while (mongoc_cursor_next(cursor, &doc)){if (!mongoc_collection_delete_one(collection, doc, NULL, NULL, &error)){fprintf(stderr, "%s\n", error.message);result = -2;}}bson_destroy(query);mongoc_cursor_destroy(cursor);mongoc_collection_destroy(collection);mongoc_client_destroy(client);return result;}int main(int argc, char *argv[]){mongoc_init();const char *uri_string = "mongodb://10.8.198.55:27017";const char *database = "event_database";const char *collection = "student_coll";/* delete documents with options in collection */char json_opts[300] = { "{\"age\":19}" };if (0 == lib_collection_delete_document(uri_string, database, collection, json_opts)){printf("Delete successful\n");}mongoc_cleanup();return 0;}
运行结果:
三、libbson库的使用
将bson格式转换成json格式(value不带类型)
函数:char * bson_as_json (const bson_t *bson, size_t *length);
输出格式:
注意事项:函数返回值(指针)记得使用函数
void bson_free (void *mem)
释放将bson格式转换成json格式(value带类型)
函数:char * bson_as_canonical_extended_json (const bson_t *bson, size_t *length)
输出格式:
注意事项:函数返回值(指针)记得使用函数
void bson_free (void *mem)
释放
视点!libmongoc库和libbson库的使用
iQOO 11性能猛挤牙膏:130万跑分、内存秒变24GB
一块屏幕同时两种刷新率!iQOO 11支持LTPO4.0+分区高刷
最新快讯!领124元神券!蒙牛Nopa燃型低脂纤维奶昔牛乳大促:10瓶35元
《阿凡达2》首映后被批了 影评人:剧情没第一部好看!全片冗长、台词沉闷
Redis这个内存回收,确实有点牛逼!!!
Azure Devops 流水线任务插件开发教程 (1/3) —— Quick Start
滚动:一行代码 网页变灰
百度爱番番基于图技术、流式计算的实时CDP建设实践
世界微速讯:PDF转Word完全指南:3大方法满足各种场景!
Win10无Internet访问权限怎么解决?无Internet访问权限的原因
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
京东怎么分期付款?京东怎么看一共花了多少钱?
photoshopcs4序列号有哪些?pscs4的永久序列号分享
【天天报资讯】云边协同下的统一应用管理: 基于 OpenYurt 和 KubeVela 的解决方案
苹果手机显示iPhone已停用怎么办?iphone已停用是什么意思?
全球速读:行为管理(锐捷无线篇)
环球热议:app提交上架最新流程 ios
热讯:RFID读写器与西门子PLC 1200的tcp通信
C++的语法 学习笔记1
今日讯!聊聊与前端工程师天然互补的 Serverless
片长190分钟超130万人想看!《阿凡达2:水之道》总票房突破3000万
最新消息:Nature最新:熊去氧胆酸可预防新冠、不怕病毒变异
世界热门:骁龙8 Gen2价格屠夫!moto X40系列定档12月15日
环球讯息:南京一地铁口被大量共享单车堵死 密密麻麻场面壮观:大家应文明骑行规范停车
今日最新!家长注意!羽绒服会让儿童安全座椅失效:有致命危险
世界热门:CVE-2015-4852 Weblogic T3 反序列化分析
全球实时:新能源车爆发 锂矿价格翻10倍 宁德宜春等多城提出打造“锂都”
资讯:降多少你会买?消息称RTX 4080要降价几千 首发用户将受伤 会有赔偿吗?
走后门上班?马斯克两位堂兄弟入职推特 成全职员工
天天热点!一张照片立即变视频主角 “AI换脸”惹上事 女子获赔5000元
东北零下20度 男子雪碧放车里一晚被冻炸:按键都不好使了
环球视点!厉害!韩国所有人将至少年轻1-2岁:网友看完方法直呼意外
天天微资讯!30年老司机成功预判避免车祸 当事人:本能反应 预感到它们刹不住
每日看点!日本最好大学东京大学2022年校花冠军出炉引网友热议 甜美可爱的学霸妹子
视讯!OpenGL 透明度
大数据量、高并发业务怎么优化?(一)
每日简讯:第一次看到水冷的RX 7900 XTX:漂亮得不像话
环球微头条丨新一代显卡危机 《传送门》光追性能实测:卡成1帧PPT、RTX 4090惨败
全球首款第二代骁龙8+2K直屏旗舰!iQOO 11今天发
一到冬天就黑屏!但是 大众好像根本就不打算管
天天快资讯:python中的函数进阶
实时焦点:C++入门级基础知识汇总
天天微资讯!Arc显卡也能战未来 Intel新驱动实测:性能提升真打鸡血
大中华区立功 消息称马斯克将任命朱晓彤特斯拉全球CEO
当前最新:JavaWeb三大组件(Servlet、Filter、Listener)
世界报道:蓝牙协议(HFP、HSP、A2DP、AVRCP)简介
大前端html基础学习04--文本溢出
热推荐:电动车生产基地杀到欧洲?比亚迪最新回应来了
天天日报丨无2D版!《阿凡达2》预售开启:平均票价68元 首映口碑好评爆棚
【世界新要闻】备受年轻人追捧的“网红餐厅”有多坑?不服不行
环球即时:Springboot处理跨域请求
shell编程时出现:未预期的符号 `then' 附近有语法错误 或者 : 行 : `then'
世界最新:CSS Margin中5个经典布局解决方案,重难点知识,记得收藏复习
快播:实火!《阿凡达2:水之道》预售首日总票房突破千万
小米13系列发布会时间偷跑 最新售价信息曝光:3999/4999元起售
天天头条:中国石化又一次产出99.999%高纯度氢:每年2100吨
即时看!12306购票页面变了:已取消查验核酸弹窗
天天观热点:双11期间快递达42.7亿件 你的收到了吗?
【快播报】员工爆料奶茶店用过期原料 老板:事儿太多
【全球热闻】刘海屏iPhone用上灵动岛:越狱软件开发者推出“灵动刘海”
路怒可怕!出租车插队未果隧道逼停保时捷 还质问开豪车了不起:罚600扣1分
节省1000元成本 特斯拉减配辅助停车的超声波雷达:把新车主们坑惨了
暴雪《魔兽世界》停服或致大量游戏工作室倒闭:代打行业寒冬
加绒款同价:361° 纯色卫衣/运动裤69元大促(40元券)
Intel晒新显卡驱动表现:DX9游戏性能提升达80%
每日快播:一键部署应用到远程服务器,IDEA 官方 Docker 插件太顶了!
Vue视频 | 【Vue2 + Vue3 前端教程】完整版
今日关注:记录--微信小程序获取用户信息的最新方法记录
当前短讯!12 虚拟机字节码执行引擎_字节码执行机制
CompletableFuture源码解析
全球限量5000台!ThinkPad X1 Carbon 30周年纪念版即将上市
最新资讯:老马也失蹄 吞剑大师嘴插5把剑出意外被刺穿内脏:宣布收山
NASA毅力号火星车和国际空间站上的SSD:出自群联之手
网友不知情下话费暴涨2倍至99元 客服:一般会提前通知
每日快讯!Redis配置、优化及相关命令
《阿凡达》为何时隔13年推出续作?卡梅隆回应:光剧本就写了4版
全球时讯:纯电越野车真香!奇瑞也来参一脚:邀网友共创、最多奖励5万
每日视讯:一天1500元 索赔77万元代步车费用!博主曝特斯拉“精彩”上诉状
黄牛栽了!急于出手RTX 4080
两轮电动车在印度卷起来了:5年/6万公里质保、1年免费充电
Power BI 15 DAY
【高精密时钟】NTP网络校时服务器在WIN平台下调试步骤
微头条丨Chatgpt注册全流程教程
KMP算法详解-字符串匹配
焦点信息:精美的web前端源码的特效
天天短讯!女子连续服用6片感冒药致肝衰竭 专家提醒:药不能随便吃
男子被狗舔伤口发视频炫耀狗子贴心:听网友劝后打狂犬疫苗
全球播报:乐视诉清华大学获赔:内网提供电影下载 7年前就关停了
国服腾讯、网易等谁来代理?暴雪《暗黑4》发售时间曝光:容量80GB
环球动态:男子醉驾撞树想溜 爱车自动报警 并发送了定位
全球热点!JS设计模式 之 发布-订阅模式
最近沉迷Redis网络模型,无法自拔!终于知道Redis为啥这么快了
热点聚焦:行为管理(锐捷行业网关篇)
全球时讯:文盘Rust -- r2d2 实现redis连接池
前端精准测试实践
世界速递!JavaScript中 FileReader 对象详解
【世界报资讯】大数据-数据仓库-实时数仓架构分析
热头条丨JAVA8 函数式编程(1)- Lambda表达式
易基因|m6A去甲基化酶ALKBH5通过降低PHF20 mRNA甲基化抑制结直肠癌进展 | 肿瘤研究