一、什么是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
微信扫一扫
支付宝扫一扫