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