环境:
应用场景:检测模型检测出的异常图片,需要存档记录,方便后期查询修改.由于存储的数据中有图片,当时采用二进制数据格式存储的,你也可以存储图片的URL路径.因此,使用mongdb数据库,将数据存到磁盘.本篇文章是自己在项目中用到的技术点.
1.ubuntu(PC和Jetson nano)
2.mongodb c语言驱动
3.使用到的客户端程序:nosqlbooster4mongo-5.2.12.AppImage
数据库的基本工能是增删改查,文件存储格式为BSON(一种JSON的扩展)。存储在集合中的文档,被存储为键-值对的形式。键用于唯一标识一个文档,为字符串类型,而值则可以是各中复杂的文件类型。我们称这种存储形式为BSON(Binary Serialized dOcument Format)。
GridFS是Mongo的一个子模块,使用GridFS可以基于MongoDB来持久存储文件。并且支持分布式应用(文件分布存储和读取)。作为MongoDB中二进制数据存储在数据库中的解决方案,通常用来处理大文件,对于MongoDB的BSON格式的数据(文档)存储有尺寸限制,最大为16M。但是在实际系统开发中,上传的图片或者文件可能尺寸会很大,此时我们可以借用GridFS来辅助管理这些文件。
安装mongdb数据库服务
第1步 – 导入公钥:sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 2930ADAE8CAF5059EE73BB4B58712A2291FA4AD5
第2步 – 创建源列表文件MongoDB:echo “deb http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.6 multiverse” | sudo tee /etc/apt/sources.list.d/mongodb-org-3.6.list
第3步 – 更新存储库:sudo apt-get update
第4步 – 安装MongoDB:sudo apt-get install -y mongodb-org
启动MongoDB并将其添加为在启动时启动的服务:systemctl start mongod systemctl enable mongod
用netstat命令检查MongoDB是否已经在端口27017上启动:netstat -plntu
安装mongodb c驱动
由于考虑到兼容性问题,
第1步:git clone https://github.com/mongodb/mongo-c-driver.git
第2步:cd mongo-c-driver
第3步:git checkout x.y.z # To build a particular release
第4步:python build/calc_release_version.py > VERSION_CURRENT
第5步:mkdir cmake-build , cd cmake-build
第6步:cmake -DENABLE_AUTOMATIC_INIT_AND_CLEANUP=OFF …
第7步:sudo make install
mongo基本命令:
1>.进入控制台界面:mongo
2>.显示mongodb中有哪些数据库:show dbs;显示当前正在使用的数据库:db;选择使用的数据库(不存在就创建):use runoob
3>.创建数据库:use runoob,db.runoob.insert({“name”:“菜鸟教程”}),show dbs(在 MongoDB 中,集合只有在内容插入后才会创建! 就是说,创建集合(数据表)后要再插入一个文档(记录),集合才会真正创建。)
4>.删除数据库:use runoob,db.dropDatabase()
5>.集合操作:use runoob,db.createCollection(“runoob”),show tables/show collections, db.runoob.drop()
6>.创建集合:db.createCollection(“mycol”, { capped : true, autoIndexId : true, size : 6142800, max : 10000 }) capped如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。当该值为 true 时,必须指定 size 参数。
7>.删除集合:show collections,db.mycol.drop()
8>.插入文档:use runoob,show tables/show collections, db.col.insert({“key”:“vvv”}) (往col集合/表里面插入数据,如果col不存在,则创建)
9>.查看文档:db.col.find() / db.runoob.find().pretty(),更新文档:db.runoob.update({‘name’:‘菜鸟教程’},{KaTeX parse error: Expected 'EOF', got '}' at position 28: …:'MongoDB2222'}}̲) db.col…or:[{“name”:“333333”},{“name”: “1111111”}]})
设置mongodb数据库对外访问
步骤(一般都是在局域网内访问):
1.vim /etc/mongod.conf(这mongdb的配置文件,修改完记得重启mongdb服务.里面还可以修改数据库存储地址)
2.bindIp: 127.0.0.1 ==> bindIp: 0.0.0.0
3.sudo systemctl restart mongod.service
4.lsof -i -n | grep -i “listen”
远程连接:mongodb:mongo --host 192.168.51.56 --port 27017
//由于保密性原因,只给出部分测试代码.
//cpp代码
CMongo::CMongo()
{
memset(&m_ConnectInfo, 0, sizeof(m_ConnectInfo));
m_pClient = nullptr;
m_pDataBase = nullptr;
mongoc_init();
}
CMongo::~CMongo()
{
mongoc_cleanup();
}
//初始化数据库连接信息
bool CMongo::Init(const tagConnectInfo& connect_info)
{
memcpy(&m_ConnectInfo, &connect_info, sizeof(m_ConnectInfo));
return Connect();
}
//释放数据库连接信息
bool CMongo::Release()
{
Disconnect();
memset(&m_ConnectInfo, 0, sizeof(m_ConnectInfo));
return true;
}
//获取所有集合
bool CMongo::GetAllCollection(std::vector<std::string> &collection_name_list)
{
//校验连接
if (!Connect()) return false;
//获取集合
mongoc_cursor_t * cursor = mongoc_database_find_collections_with_opts(m_pDataBase, nullptr);
const bson_t * doc = nullptr;
while (mongoc_cursor_next(cursor, &doc))
{
if (0)
{
char * str = bson_as_canonical_extended_json(doc, nullptr);
printf("\n\n%s\n\n", str);
bson_free(str);
}
else
{
bson_iter_t iter;
bson_iter_init(&iter, doc);
if (bson_iter_find(&iter, "name"))
{
collection_name_list.push_back(bson_iter_utf8(&iter, nullptr));
}
}
}
//错误检查
bson_error_t error;
if (mongoc_cursor_error(cursor, &error))
{
printf("get collection list failed, error message: %s\n", error.message);
mongoc_cursor_destroy(cursor);
return false;
}
//释放资源
mongoc_cursor_destroy(cursor);
return true;
}