一、什么是MongoDBClient
MongoDBClient是MongoDB官方提供的C++17客户端库,用来连接、操作MongoDB数据库。MongoDBClient提供了多种API,包括CRUD操作、聚合查询、地理空间索引等。
二、如何使用MongoDBClient连接数据库
使用MongoDBClient连接数据库分为三个步骤:创建连接、指定数据库、验证身份。
#include #include int main() { // 创建实例 mongocxx::instance inst{}; // 创建客户端 mongocxx::client conn{ mongocxx::uri{} }; // 指定数据库和集合 auto db = conn["dbname"]; auto coll = db["collectionname"]; // 凭据验证 auto builder = bsoncxx::builder::stream::document{}; bsoncxx::document::value doc_value = builder << "user" << "myuser" << "pwd" << "mypwd" << bsoncxx::builder::stream::finalize; auto creds = mongocxx::uri::auth_mechanism_properties{} .add("SCRAM-SHA-1", bsoncxx::types::b_document{doc_value}); // 连接MongoDB conn.authenticate(creds); return 0; }
三、CRUD操作
1. 插入数据
MongoDBClient提供了多种插入数据的API,最常用的是insert_one()和insert_many()。
// 插入单条数据 auto builder = bsoncxx::builder::stream::document{}; bsoncxx::document::value doc_value = builder << "name" << "Tom" << "age" << 20 << bsoncxx::builder::stream::finalize; coll.insert_one(doc_value.view()); // 插入多条数据 std::vector docs; for (int i = 0; i < 5; ++i) { auto builder = bsoncxx::builder::stream::document{}; bsoncxx::document::value doc_value = builder << "name" << "Tom" << "age" << 20+i << bsoncxx::builder::stream::finalize; docs.push_back(doc_value); } coll.insert_many(docs);
2. 查询数据
MongoDBClient提供了多种查询数据的API,最常用的是find_one()和find()。
// 查询单条数据 auto result = coll.find_one( make_document(kvp("name", "Tom")) ); std::cout << bsoncxx::to_json(*result) << std::endl; // 查询多条数据 auto cursor = coll.find( make_document(kvp("age", make_document(kvp("$gte", 20)))) ); for (auto&& doc : cursor) { std::cout << bsoncxx::to_json(doc) << std::endl; }
3. 修改数据
MongoDBClient提供了多种修改数据的API,最常用的是update_one()和update_many()。
// 修改单条数据 coll.update_one( make_document(kvp("name", "Tom")), make_document(kvp("$set", make_document(kvp("age", 30)))) ); // 修改多条数据 coll.update_many( make_document(kvp("name", "Tom")), make_document(kvp("$set", make_document(kvp("age", 30)))) );
4. 删除数据
MongoDBClient提供了多种删除数据的API,最常用的是delete_one()和delete_many()。
// 删除单条数据 coll.delete_one( make_document(kvp("name", "Tom")) ); // 删除多条数据 coll.delete_many( make_document(kvp("name", "Tom")) );
四、聚合查询
MongoDBClient支持多种聚合查询操作,如计算总数、去重、分组、排序等。
// 计算总数 auto total_cursor = coll.aggregate( make_array(bsoncxx::from_json(R"( { $count: "total" } )")) ); auto total_view = total_cursor.begin()->view(); std::cout << bsoncxx::to_json(total_view) << std::endl; // 去重 auto distinct_cursor = coll.aggregate( make_array(bsoncxx::from_json(R"( { $group: { _id: "$name" } }, { $sort: { _id: 1 } } )")) ); for (auto&& doc : distinct_cursor) { std::cout << bsoncxx::to_json(doc) << std::endl; } // 分组 auto group_cursor = coll.aggregate( make_array(bsoncxx::from_json(R"( { $group: { _id: "$name", count: { $sum: 1 } } }, { $sort: { count: -1 } } )")) ); for (auto&& doc : group_cursor) { std::cout << bsoncxx::to_json(doc) << std::endl; }
五、地理空间索引
MongoDBClient支持地理空间索引,可以实现根据经纬度查询附近的位置。
// 创建地理空间索引 auto index_spec = bsoncxx::builder::stream::document{}; bsoncxx::document::value index_value = index_spec << "loc" << "2dsphere" << bsoncxx::builder::stream::finalize; bsoncxx::document::view index_view = index_value.view(); coll.create_index(index_view); // 插入数据 auto doc_builder = bsoncxx::builder::stream::document{}; bsoncxx::document::value doc_value = doc_builder << "name" << "Tom" << "loc" << bsoncxx::builder::stream::open_document << "type" << "Point" << "coordinates" << bsoncxx::builder::stream::open_array << 116.3975 << 39.9085 << bsoncxx::builder::stream::close_array << bsoncxx::builder::stream::close_document << bsoncxx::builder::stream::finalize; coll.insert_one(doc_value.view()); // 查找附近的位置 auto nearby_cursor = coll.find( make_document(kvp("loc", make_document(kvp("$nearSphere", make_document(kvp("$geometry", make_document(kvp("type", "Point"), kvp("coordinates", make_array(116.4038, 39.915)))) ), kvp("$maxDistance", 5000) )) )) );
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/187455.html