mongodb-cxx-driver使用

article/2025/9/19 20:16:39

mongocxx driver 是构建在 MongoDB C driver 之上的

1.首先需要安装mongo-c-driver

 wget https://github.com/mongodb/mongo-c-driver/releases/download/ 1.23.1/mongo-c-driver-1.23.1.tar.gz 
tar xzf mongo-c-driver-1.23.1.tar.gz 
cd mongo-c-driver-1.23.1 
mkdir cmake-build
cd cmake-build 
cmake -DENABLE_AUTOMATIC_INIT_AND_CLEANUP=OFF  ..
make && make install

2.编译mono-cxx-driver

mongo官方推荐

  • 针对mongocxx-3.7.x,需要libmongoc 1.22.1或更高版本。
  • 对于mongocxx-3.6.x,需要libmongoc 1.17.0或更高版本。
  • 对于mongocxx-3.5.x,需要libmongoc 1.15.0或者更高版本。
  • 对于mongocxx-3.4.x,需要libmongoc 1.13.0或者更高版本。
  • 对于mongocxx-3.3.x,需要libmongoc 1.10.1或更高版本。
  • 对于mongocxx-3.2.x,需要libmongoc 1.9.2或更高版本。
  • 针对mongocxx-3.1.4+,需要libmongoc 1.7.0或更高版本。
  • 对于mongocxx-3.1.[0-3],需要libmongoc 1.5.0或更高版本。
  • 对于 mongocxx-3.0.x,我们推荐使用最新的 1.4.x 版本的 libmongoc

并且当前最稳定的版本是3.5,因此使用3.5.1支持

git config --global http.postBuffer 1048576000
git clone --recursive https://github.com/mongodb/mongo-cxx-driver.git
cd /mongo-cxx-driver
git checkout r3.5.1   #切换到3.5.1分支
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=`pwd`/install
make
make install 

编译后被安装到/mongo-cxx-driver/build/install,将include和lib拿出来使用即可

注意:

mongo-cxx-driver 使用了 C++17 的功能std::optional和 std::string_view

3.启动mongo

wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu2004-6.0.3.tgz
tar xf mongodb-linux-x86_64-ubuntu2004-6.0.3.tgz
mv mongodb-linux-x86_64-ubuntu2004-6.0.3/ /usr/local/mongodb
export PATH=/usr/local/mongodb/bin:$PATH
cd /usr/local/mongodb

此时/usr/local/mongodb/bin目录下包含三个:install_compass,mongod,mongos

  • install_compass:MongoDB Compass的特定于平台的安装脚本 。
  • mongod:mongoDB 服务端工具
  • mongos:mongos 是 MongoDB shard 的缩写,它是一个为应用层提供查询请求并决定数据在 MongoDB 分片中位置的路由服务。

创建目录,mkdir -p /data/db 存储mongo数据,最终执行mongod即可启动mongo服务器

通过容器启动mongo

第一步:拉取镜像

docker pull mongo:latest

第二步:启动容器

docker run -itd --name mongo -p 27017:27017 -v /xxx/mongodb:/data/db mongo --auth
  • -p:映射容器服务的 27017 端口到宿主机的 27017 端口,mongodb 默认端口为 27017。容器外部可以通过宿主机 IP 27017 端口访问到容器内的 mongodb 服务
  • -v:为设置容器的挂载目录,这里是将 <LocalDirectoryPath> 即本机中的目录挂载到容器中的 /data/db中,作为 mongodb 的存储目录(建议为 /mongodb/data
  • --name:为设置该容器的名称
  • -d:设置容器以守护进程方式运行
  • --auto:需要密码才能访问服务

第三步:进入容器

docker exec -it mongo /bin/bash

 第四步:创建用户

mongosh admindb.createUser({ user:'admin',pwd:'123456',roles:[ { role:'userAdminAnyDatabase', db: 'admin'},"readWriteAnyDatabase"]});db.auth('admin', '123456')

 db.createUser的各个字段含义:

  user字段,为新用户的名字;
    pwd字段,用户的密码;
    cusomData字段,为任意内容,例如可以为用户全名介绍;
    roles字段,指定用户的角色,可以用一个空数组给新用户设定空角色;
    在roles字段,可以指定内置角色和用户定义的角色。

Built-In Roles(内置角色):
    1. 数据库用户角色:read、readWrite;
    2. 数据库管理角色:dbAdmin、dbOwner、userAdmin;
    3. 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
    4. 备份恢复角色:backup、restore;
    5. 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
    6. 超级用户角色:root  

此时可以直接进入容器操作mongo

 不用再安装mongodbshell

4.使用mongodb shell

MongoDB Shell 是mongosh一个功能齐备的 JavaScript 和 Node.js 16.x  REPL环境,用于与 MongoDB 部分进行交互。您可以使用 MongoDB Shell 直接使用数据库测试查询和操作。

curl -O https://downloads.mongodb.com/compass/mongosh-1.6.1-linux-x64-openssl11.tgz?_ga=2.45979044.1274179345.1671708610-47372173.1671708610
tar xf mongosh-1.6.1-linux-x64-openssl11.tgz?_ga=2.45979044.1274179345.1671708610-47372173.1671708610
cd mongosh-1.6.1-linux-x64-openssl11/bin
chmod +x mongosh

终端执行mongosh,连接到mongodb服务器

默认连接到mongosh " mongodb://localhost:27017 "

注意:系统安装了openssl1故此处下载openssl111.tgz

4.1 mongodb shell操作

1)创建用户

test> use admin
switched to db admin
admin> db.createUser({user: 'test', pwd: 'admin1234', roles:[{ role: 'readWrite', db: 'test' }]})
{ ok: 1 }

1)创建数据库

test> use foundry_connector
switched to db foundry_connector
foundry_connector>

如果数据库不存在则创建,存在则切换到对应数据库

 2)显示数据库

test> show dbs
admin   40.00 KiB
config  60.00 KiB
local   72.00 KiB
test> use foundry_connector
switched to db foundry_connector
foundry_connector> show dbs
admin    40.00 KiB
config  108.00 KiB
local    72.00 KiB

3)插入数据

发现创建的数据库不在数据库列表中,需要插入一些数据才能显示出来

foundry_connector> db.foundry_connector.insert({"id":"1","name":"face","tags":"face_recognize","desc":"hhh"})
DeprecationWarning: Collection.insert() is deprecated. Use insertOne, insertMany, or bulkWrite.
{acknowledged: true,insertedIds: { '0': ObjectId("63a519a6c5abf6f696548aa5") }
}
foundry_connector> show dbs
admin               40.00 KiB
config             108.00 KiB
foundry_connector   40.00 KiB
local               72.00 KiB
foundry_connector>

4)创建集合

在数据库foundry_connector中创建集合

5)查询

test> db.foundry_connector.find().pretty()
[{_id: ObjectId("63a52198f2ca74e6853755f3"),id: '1',name: 'face',tags: 'face_recognize',desc: 'hhh'}
]

删除

1)删除单个

 db.data_set_source.deleteOne({'_id':'69'})

 2)删除多个

5.C++ example

test.cc示例如下

#include <iostream>
#include <cstdint>#include <bsoncxx/builder/stream/document.hpp>
#include <bsoncxx/json.hpp>#include <mongocxx/client.hpp>
#include <mongocxx/instance.hpp>using bsoncxx::builder::stream::close_array;
using bsoncxx::builder::stream::close_document;
using bsoncxx::builder::stream::document;
using bsoncxx::builder::stream::finalize;
using bsoncxx::builder::stream::open_array;
using bsoncxx::builder::stream::open_document;int main() {std::cout<<"1.初始化"<<std::endl;const char* mongoURI = "mongodb://127.0.0.1:27017";mongocxx::instance inst{};mongocxx::uri uri(mongoURI);//2.连接mongostd::cout<<"2.连接mongo"<<std::endl;mongocxx::client conn{uri};auto collection = conn["foundry_connector"]["foundry_connector"];if(collection)std::cout<<"connect mongodb ok"<<std::endl;// 3.创建文档std::cout<<"3.创建并插入文档"<<std::endl;auto builder = bsoncxx::builder::stream::document{};bsoncxx::document::value doc_value = builder<< "item" << "journal"<< "qty" << 25<< "tags" << bsoncxx::builder::stream::open_array<< "blank" << "red"<< close_array<< "size" << bsoncxx::builder::stream::open_document<< "h" << 14<< "w" << 21<< bsoncxx::builder::stream::close_document<< bsoncxx::builder::stream::finalize;// 4.向集合插入文档bsoncxx::document::view doc_view = doc_value.view();bsoncxx::stdx::optional<mongocxx::result::insert_one> result = collection.insert_one(doc_view);// 5.插入另一个文档builder << "field_name" << "value_1";collection.insert_one(builder.view());// Find one with a query filterstd::cout<<"4.查询"<<std::endl;bsoncxx::stdx::optional<bsoncxx::document::value> maybe_result = collection.find_one(document{} << "i" << 102 << finalize);if(maybe_result) {std::cout << bsoncxx::to_json(*maybe_result) << "\n";}// Find all in a collectionstd::cout<<"5.查看所有collection"<<std::endl;auto cursor = collection.find({});for (auto&& doc : cursor) {std::cout << bsoncxx::to_json(doc) << std::endl;}//删除bsoncxx::stdx::optional<mongocxx::result::delete_result> delete_result = collection.delete_many({});if(delete_result) {std::cout <<"Number of deleted document(s): "<< delete_result->deleted_count() << "\n";}std::cout << "Completed\n";
}

cmakelists.txt内容如下

cmake_minimum_required(VERSION 3.18)
SET(CMAKE_CXX_STANDARD 17)project(test)
set(INCLUDE_PATH ${CMAKE_SOURCE_DIR}/3rdparty/include)
set(LIB_PATH ${CMAKE_SOURCE_DIR}/3rdparty/lib)include_directories(${INCLUDE_PATH})
link_directories(${LIB_PATH})add_executable(test test.cc)
target_link_libraries(testbsoncxxmongocxx
)


http://chatgpt.dhexx.cn/article/VGHMbjE6.shtml

相关文章

老胡的周刊(第095期)

老胡的信息周刊[1]&#xff0c;记录这周我看到的有价值的信息&#xff0c;主要针对计算机领域&#xff0c;内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。 &#x1f3af; 项目 tabby[2] 自托管的 AI 编码助手&#xff0c;…

程序员养生指北

吴小胖第八次推送 阅读时间预计3分钟~ 熬夜篇 互联网人熬夜是不能避免的&#xff0c;原因却各不相同。 不加班的时候&#xff0c;总会对自己说&#xff0c;今天一定早睡&#xff0c;然鹅... 午休篇 熬夜的程序员总想依靠午休补觉&#xff0c;然鹅... 更不幸的是&#xff0c;互联…

老杨说运维 | 中国IT运维市场的现状与趋势

文章内容来源《第一新声》 对擎创科技CEO杨辰(老杨)的专访 前言&#xff1a; 中国目前正面临百年未有之大变局&#xff0c;在这个变局中&#xff0c;不稳定性和不确定性正在增强。疫情持续反复、国际形势变化多端&#xff0c;导致国内多个行业出现发展增速下降、产供销节奏打…

老杨说运维 | 非常重要,事关转型

《荀子》有云&#xff1a;“水能载舟&#xff0c;亦能覆舟。”在公司日常运营过程中&#xff0c;数据指标就像是水&#xff0c;孕育着生命&#xff0c;承载着万物。科学的数据指标能指引公司在正确的道路上不断前进&#xff0c;使平淡无常的业务焕发新生&#xff0c;而不合理的…

学习springcloud的一些心得体会——老卫的天气预报系统

1&#xff1a;建立天气预报springboot系统 首先先建立一个天气预报的springboot系统&#xff0c;具体流程如下&#xff1a; &#xff08;1&#xff09;从cityList.xml中获取城市信息&#xff0c; &#xff08;2&#xff09;然后根据下面的链接获取各个城市的天气预报信息&am…

学习springboot项目的一些心得-----老卫的博客系统

去年年底接触了springboot框架&#xff0c;这两天复习了一遍&#xff0c;主要是跟着老卫博客系统这个课程学习的。 springboot介绍&#xff1a;总的感觉springboot就是基于spring开发的一套框架&#xff0c;好处就是不用配置复杂的依赖包&#xff0c;xml的一些文件&#xff0c…

thymeleaf和spring boot的集成踩坑总结(练习项目是老卫的博客项目)

bug1: 2019-08-08 16:44:38.102 ERROR 19810 — [nio-8080-exec-8] org.thymeleaf.TemplateEngine : [THYMELEAF][http-nio-8080-exec-8] Exception processing template “users/list”: Error resolving template “users/list”, template might not exist or might not be …

《跟老卫学 HarmonyOS 开发》:以父之名・码力全开!写段 HarmonyOS 祝父亲节

#父亲节祝福语# 爸爸在我心中就像旗帜 他教会我做人与处事的方向 在父亲节这个特别的日子里 我想对爸爸说长大以后我就要成为您 使用ArkUI开发“父亲节的祝福” 使用ArkUI开发“父亲节的祝福”&#xff0c;效果如下&#xff1a; 使用DevEco Studio整体开发HarmonyOS整体时…

【老卫搞机】090期:键盘?主机?全功能键盘主机!

这是一台我个人DIY的第二代键盘主机&#xff08;第一代见&#xff1a;【老卫搞机】074期&#xff1a;键盘&#xff1f;主机&#xff1f;键盘主机&#xff01;_哔哩哔哩_bilibili&#xff09;。相比与第一代的作品&#xff0c;第二代产品除了USB 3接口、USB 2接口、mini HDMI接口…

【老卫拆书】009期:Vue+Node肩挑全栈!《Node.js+Express+MongoDB+Vue.js全栈开发实战》开箱

今天刚拿到一本新书&#xff0c;叫做《Node.jsExpressMongoDBVue.js全栈开发实战》&#xff0c;做个开箱。 外观 先从外观上讲&#xff0c;这本是全新的未开封的&#xff0c;膜还在。 这本书介绍从技术原理到整合开发实战&#xff0c;以丰富的项目展现全栈开发的一个技巧。 …

【老卫搬砖】034期:HarmonyOS 3.1 Beta 1初体验,我在本地模拟器里面刷短视频

今天啊打开这个DevEco Studio的话&#xff0c;已经提示有3.1Beta1版本的一个更新啊。然后看一下它的一些特性。本文也演示了如何在本地模拟器里面运行HarmonyOS版短视频。 主要特性 新特性包括&#xff1a; Added support for Windows 11 64-bit and macOS 13.x OSs, as well…

【老卫搞机】135期:华为开发者联盟社区2022年牛人之星奖品开箱!

首先祝大家兔年大吉&#xff0c;身体安康&#xff0c;钱兔似锦&#xff01;今天咱们来开箱一件特殊的奖品&#xff0c;来自华为开发者联盟社区的新年祝福——2022年牛人之星。 华为有钱&#xff01;惯例用的是顺丰快递&#xff0c;各位看一下这里面是有很多件的 有这两件。第一…

【老卫搞机】136期:华为开发者联盟社区2022年度战码先锋2期开源贡献之星

首先祝大家兔年大吉&#xff0c;身体安康&#xff0c;钱兔似锦&#xff01;接上次的“2022年牛人之星”&#xff08; https://developer.huawei.com/consumer/cn/forum/topic/0203109930647268095&#xff09;&#xff0c;今天咱们来开箱另外一件特殊的奖品&#xff0c;来自华为…

老卫带你学---SVM支持向量机

老卫带你学—SVM支持向量机 学习目标&#xff1a; 理解支持向量机的知识结构理解支持向量机的原理与目标理解算法推导的核心过程和意义&#xff08;关键是损失函数与约束条件的意义&#xff09;理解核函数的意义与方法 知识结构 hard margin SVM&#xff1a;可以容易的找到…

老卫带你学---推荐系统

机器学习的一种重要应用就是推荐系统。 比如我们的淘宝推荐&#xff0c;豆瓣推荐&#xff0c;优酷电影推荐等等都用到了推荐系统。 那我们来谈一谈推荐系统的细节。 推荐系统评价指标 要了解推荐系统&#xff0c;先了解其评价指标。 1.准确度 precisionTP/TPFP; recallTP/TP…

老卫带你学---最大熵模型与EM算法

最大熵模型与EM算法 最大熵模型与EM算法在机器学习里面尤为重要。接下来我们一步一步的介绍相关细节&#xff1a; 先验概率与后验概率 后验概率就是通过已有的数据来推断未知的数据&#xff0c;先验概率就是直接对未知的数据进行预测。 所以&#xff0c;我们机器学习的目标就…

SQL创建数据库提示“无法获得数据库 ‘model‘ 上的排他锁。请稍后重试该操作”处理方法

use master --选择数据库 go declare sql varchar(100) while 11 begin select top 1 sql kill cast(spid as varchar(3)) from master..sysprocesses where spid > 50 and spid <> spid and dbid db_id(model)if rowcount 0 break ;print(sql) --打印杀掉进…

SQL Server 数据库创建与删除

目录 &#xff08;一&#xff09;前言 &#xff08;二&#xff09;创建数据库方式 1. 数据库创建方式一 SSMS 方式 &#xff08;1&#xff09; 点击新建数据库想选项 &#xff08;2&#xff09; 新建数据库页面配置 2. 数据库创建方式二 T-SQL 方式 &#xff08;三&…

SQL Server基础学习——用代码创建数据库和表

&#xff11;.连接成功后出现下述页面&#xff0c;那么我们学习第一步先建个数据库和表 &#xff12;.建立之前要了解基础SQL语言 SQL语言是集DDL、DML、DCL 于一体的数据库语言。 &#xff11;&#xff09;DDL语句引导词&#xff1a;Create&#xff08;建立&#xff09;、Alt…

SQL Server数据库(创建及管理)

做好学习记录,方便随时查看。^ v ^一、数据库文件:系统数据库+用户数据库 1、系统数据库: 随程序一起安装,用户提供系统所需要的数据的数据库,是SQL Server运行的基础。 1)master数据库(主数据库) 用于记录SQL Server的所有系统级别的信息,若被损坏,SQL Server将无…