Qt调用MongoDB数据库
环境
Windows10
Visual Studio 2019
CMAKE 3.26.0
MongoDB 1.23.2
- mongo-c-driver
- mongo-cxx-driver
boost 1.81.0
Qt 5.15.2
安装Visual Studio 2019
具体教程可见【此处】,不再多复述。
安装CMAKE
从【官网】下载CMAKE,解压后,将bin文件夹的路径,加入到windows的环境变量之中,随后一路点击“确定”即可。
安装 mongo-c-driver
在安装mongo的c++库之前,需要先安装c-driver,可参考【官网】。
先在 https://github.com/mongodb/mongo-c-driver/releases 下载mongo-c-driver。
下载好后解压至mongo-c-driver-1.23.2文件夹中,并新建Build文件夹。
整个文件夹的上下级关系如:
进入Build目录,打开cmd窗口。
小技巧:可以直接在顶部输入cmd,直接打开当前目录下的cmd窗口。
再打开的cmd窗口中输入如下命令:
cmake -G "Visual Studio 16 2019" "-DCMAKE_INSTALL_PREFIX=E:\work\WorkFile\MongoDB\mongo-c-driver-1.23.2\Build" "-DCMAKE_PREFIX_PATH=E:\work\WorkFile\MongoDB\mongo-c-driver-1.23.2\Build" ..\mongo-c-driver-1.23.2
如果没有报错的话,Build文件中会生成一个文件mongo-c-driver.sln。
然后打开Visual Studio 2019,打开刚生成的项目mongo-c-driver.sln,把debug模式改为release模式,并右键“ALL_BUILD”,选择“生成”。
这里要等几分钟,生成成功后,再右键“INSTALL”,选择“生成”。
如此mongo-c-driver就安装完成了,可以看到在Build文件夹下,生成一个bin文件夹存放*.dll文件,lib文件夹存放*.lib文件,include文件夹都是编码需要的头文件。
安装Boost
因为mongo-cxx-driver的编译还需要Boost,所以我们需要先安装这一部分。
在【官网】下载最新版的boost。
把下载的zip解压,解压后双击文件【bootstrap.bat】,随后会看到在目录中生成一个【b2.exe】,再双击exe程序,boost会自动进行编译,此过程需要半小时左右的耗时,可以先摸个鱼。
编译完成后,把boost的路径添加进入环境变量。
安装mongo-cxx-driver
在【https://github.com/mongodb/mongo-cxx-driver】下载zip代码文件,并解压在mongo-cxx-driver目录下,同时在mongo-cxx-driver目录下新建一个Build文件夹。
进入Build文件夹,打开cmd窗口,输入:
cmake -G "Visual Studio 16 2019" "-DBOOST_ROOT=D:\Users\boost_1_81_0" "-DCMAKE_PREFIX_PATH=E:\work\WorkFile\MongoDB\mongo-c-driver-1.23.2\Build" "-DCMAKE_INSTALL_PREFIX=E:\work\WorkFile\MongoDB\mongo-cxx-driver\Build" -DBUILD_VERSION=1.23.2 ..\mongo-cxx-driver-master
注意,这里要加入“-DBUILD_VERSION=1.23.2”,我之前没加这句话一直报错。
成功后,会在Build文件夹下生成【MONGO_CXX_DRIVER.sln】文件,接着在cmd中输入:
cmake ..\mongo-cxx-driver-master -DCMAKE_BUILD_TYPE=Release -DLIBMONGOC_DIR=E:\work\WorkFile\MongoDB\mongo-c-driver-1.23.2\Build -DLIBBSON_DIR=E:\work\WorkFile\MongoDB\mongo-c-driver-1.23.2\Build -DCMAKE_INSTALL_PREFIX=E:\work\WorkFile\MongoDB\mongo-cxx-driver\Build
每个人的路径都不同,注意修改。
完成后用Visual Studio 2019,打开刚生成的项目MONGO_CXX_DRIVER.sln,把debug模式改为release模式,并右键“ALL_BUILD”,选择“生成”。
等待生成完成后,再选择“INSTALL”,右键点击“生成”。
测试mongo数据库
至此,我们mongo的c++库就安装完成了,我们下载一个mongo的二进制文件来测试一下。
到【官网】下载程序。
按需配置好后,解压下载的zip文件,此时我们在bin文件夹下双击mongo.exe是不能运行的,我们还需要做一个配置。
1、在bin同等级下新建文件夹data,在data文件夹下再新建文件夹db。
2、在bin同等级下新建文件夹log,在log文件夹下新建文件mongodb.log。
3、进入到bin目录,打开cmd窗口,输入:
mongod --dbpath=..\data\db
4、此时窗口上会输出很多信息,我们在信息中找到ip和port端口号,一般默认都会是127.0.0.1和27017
5、关闭cmd窗口后,在bin同等级下新建文件夹conf,新建文件mongodb.conf,文件中输入代码:
systemLog:
destination: file
# 指定日志存放文件
path: E:\work\WorkFile\MongoDB\mongodb_exe\log\mongodb.log
logAppend: true
storage:
journal:
enabled: true
# 指定存放数据文件的全路径
dbPath: E:\work\WorkFile\MongoDB\mongodb_exe\data
net:
bindIp: 127.0.0.1
port: 27017
setParameter:
enableLocalhostAuthBypass: false
6、随后,在bin目录下打开一个cmd,输入:
mongod --config ..\conf\mongodb.conf
此窗口在数据库使用期间不要关闭,否则会导致数据库连接失败。
7、再在bin目录下打开一个新的cmd窗口,输入:
mongo
如此便成功打开数据库了,可以输入测试命令:
数据库基础的操作shell命令,可以看这里:mongodb shell命令大全
1、查看已存在的数据库列表:
show databases
或者是:
show dbs
2、进入数据库,如果数据库不存在则创建:
use DemoDB
3、查看当前所在的数据库名:
db
4、查看数据库中所有集合名:
show collections
5、创建新集合:
db.createCollection("my_collection")
4、在集合中插入数据
db.my_collection.insertOne({uid:1,name:"cdm"})
5、查看集合中的数据
db.my_collection.find()
6、删除当前数据库
db.dropDatabase()
Qt使用Mongo
我们新建一个qt工程,在pro文件中,使程序支持c++17的语法,加入语句:
CONFIG += c++17
随后在pro文件中,添加mongo-cxx-driver和boost的库和头文件的路径:
# MongoDB库
LIBS += -LE:/work/WorkFile/MongoDB/mongo-cxx-driver/Build/lib -lmongocxx -lbsoncxx
INCLUDEPATH += E:/work/WorkFile/MongoDB/mongo-cxx-driver/Build/include
INCLUDEPATH += E:/work/WorkFile/MongoDB/mongo-cxx-driver/Build/include/mongocxx/v_noabi
INCLUDEPATH += E:/work/WorkFile/MongoDB/mongo-cxx-driver/Build/include/bsoncxx/v_noabi
#boost路径
INCLUDEPATH += D:/Users/boost_1_81_0
新建一个测试cpp文件,TestMain.cpp和TestMain.h
想要学习更多mongoDB的c++接口,可以看这里:Qt使用MongoDB的c++接口:连接、创建、写入、读取
TestMain.h
#ifndef TESTMAIN_H
#define TESTMAIN_H
#include <QObject>
#include <QDebug>
#include <bsoncxx/builder/stream/document.hpp>
#include <bsoncxx/types.hpp>
#include <mongocxx/client.hpp>
#include <mongocxx/instance.hpp>
#include <mongocxx/uri.hpp>
#include <bsoncxx/json.hpp>
#pragma execution_character_set("utf-8")
class TestMain : public QObject
{
Q_OBJECT
public:
explicit TestMain(QObject *parent = nullptr);
~TestMain();
bool connectToHost(QString m_hostName, QString m_port);
private:
mongocxx::instance* m_dbInstance = nullptr;
mongocxx::client* m_client = nullptr;
signals:
};
#endif // TESTMAIN_H
TestMain.cpp
#include "TestMain.h"
TestMain::TestMain(QObject *parent) : QObject(parent)
{
bool ret = connectToHost("localhost", "27017");
if(!ret) {
qDebug() << "mongodb连接失败!";
}
}
TestMain::~TestMain()
{
delete m_dbInstance;
m_dbInstance = NULL;
delete m_client;
m_client = NULL;
}
bool TestMain::connectToHost(QString m_hostName, QString m_port)
{
if(m_hostName=="" || m_port=="")
return false;
mongocxx::uri uri{ QString("mongodb://%1:%2").arg(m_hostName).arg(m_port).toLatin1().data()};
m_dbInstance = new(std::nothrow) mongocxx::instance();
m_client = new(std::nothrow) mongocxx::client(uri);
if (!m_client)
return false;
qDebug() << "连接成功!";
return true;
}
此时编译我报错了。
搞了很久都没有搞好,最后在bsoncxx/types.hpp文件中的68行,加了#ifndef Q_MOC_RUN处理:
enum class binary_sub_type : std::uint8_t {
#define BSONCXX_ENUM(name, val) k_##name = val,
#include <bsoncxx/enums/binary_sub_type.hpp>
#undef BSONCXX_ENUM
};
改成:
#ifndef Q_MOC_RUN
enum class binary_sub_type : std::uint8_t {
#define BSONCXX_ENUM(name, val) k_##name = val,
#include <bsoncxx/enums/binary_sub_type.hpp>
#undef BSONCXX_ENUM
};
#endif
编译通过,运行成功!
另外,在运行时需要将MongoDB依赖的一些dll库,与exe程序放在同一个目录下,否则会运行失败。
例如:
如此,整个流程就算是走通了,撒花❀✿✿ヽ(°▽°)ノ✿❀