1. 安装驱动

Linux/Unix (源码编译安装):
# 下载并解压源码
wget https:///mongodb/mongo-c-driver/releases/download/1.29.2/mongo-c-driver-1.29.2.tar.gz
tar xzf mongo-c-driver-1.29.2.tar.gz
cd mongo-c-driver-1.29.2

# 编译安装
mkdir cmake-build && cd cmake-build
cmake -DENABLE_AUTOMATIC_INIT_AND_CLEANUP=OFF ..
make
sudo make install
macOS (通过 Homebrew):
brew install mongo-c-driver

2. 基础使用示例

#include <bson/bson.h>
#include <mongoc/mongoc.h>

int main() {
    // 初始化驱动
    mongoc_init();

    // 创建客户端连接(默认连接到本地的 27017 端口)
    mongoc_client_t *client = mongoc_client_new("mongodb://localhost:27017");
    
    // 获取数据库和集合(相当于 SQL 的表)
    mongoc_collection_t *collection = mongoc_client_get_collection(client, "testdb", "testcoll");

    // 创建一个 BSON 文档(类似 JSON 对象)
    bson_t *doc = BCON_NEW("name", BCON_UTF8("张三"), "age", BCON_INT32(25));

    // 插入文档到集合
    bson_error_t error;
    if (!mongoc_collection_insert_one(collection, doc, NULL, NULL, &error)) {
        fprintf(stderr, "插入失败: %s\n", error.message);
    }

    // 查询年龄为 25 的文档
    mongoc_cursor_t *cursor = mongoc_collection_find_with_opts(
        collection,
        BCON_NEW("age", BCON_INT32(25)), // 查询条件
        NULL,   // 附加选项(如排序、限制数量等)
        NULL    // 读取偏好(如主节点读取)
    );

    // 遍历查询结果
    const bson_t *result;
    while (mongoc_cursor_next(cursor, &result)) {
        char *json = bson_as_relaxed_extended_json(result, NULL);
        printf("%s\n", json);
        bson_free(json); // 释放 JSON 字符串内存
    }

    // 清理资源
    bson_destroy(doc);
    mongoc_cursor_destroy(cursor);
    mongoc_collection_destroy(collection);
    mongoc_client_destroy(client);
    mongoc_cleanup(); // 驱动清理

    return 0;
}

3. 编译与运行

# 使用 pkg-config 自动链接库(确保已安装)
gcc -o example example.c $(pkg-config --cflags --libs libmongoc-1.0)
./example

关键操作详解

  1. 初始化与清理
  • mongoc_init(): 初始化驱动(必须调用)
  • mongoc_cleanup(): 程序结束前清理资源
  1. 连接 MongoDB
  • 使用 URI 格式:mongoc_client_new("mongodb://用户名:密码@地址:端口")
  • 示例:带认证的连接
mongoc_client_t *client = mongoc_client_new("mongodb://admin:123456@localhost:27017");
  1. BSON 文档操作
  • 使用 BCON_NEW 宏快速构建文档:
bson_t *doc = BCON_NEW("name", BCON_UTF8("李四"), "score", BCON_DOUBLE(95.5));
  • 复杂结构示例(嵌套文档):
bson_t *doc = BCON_NEW("user", "{", "name", "王五", "address", "{", "city", "北京", "}", "}");
  1. 增删改查操作
  • 更新文档
bson_t *query = BCON_NEW("name", "张三");
bson_t *update = BCON_NEW("$set", "{", "age", BCON_INT32(26), "}");
mongoc_collection_update_one(collection, query, update, NULL, NULL, &error);
  • 删除文档
bson_t *query = BCON_NEW("name", "李四");
mongoc_collection_delete_one(collection, query, NULL, NULL, &error);

常见问题处理

  1. 连接失败
  • 确保 MongoDB 服务已启动:systemctl start mongod(Linux)
  • 检查防火墙是否开放 27017 端口
  1. 编译错误
  • 若报错找不到头文件或库,确认是否安装驱动
  • Ubuntu/Debian 可尝试:sudo apt install libmongoc-1.0-0 libbson-1.0-0
  • 手动指定路径编译(示例):
gcc -o example example.c -I/usr/local/include/libbson-1.0 -I/usr/local/include/libmongoc-1.0 -lmongoc-1.0 -lbson-1.0
  1. 内存泄漏
  • 确保每个 _new_create 创建的指针都有对应的 _destroy_free
  1. 调试输出
  • 启用驱动日志:
export MONGOC_TRACE=ENABLED
./example

进阶参考

  • 官方文档libmongoc API
  • 高级功能:连接池、批量写入、聚合管道、索引管理
  • 性能优化:使用 mongoc_client_pool_t 实现连接池