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
关键操作详解
- 初始化与清理
mongoc_init(): 初始化驱动(必须调用)mongoc_cleanup(): 程序结束前清理资源
- 连接 MongoDB
- 使用 URI 格式:
mongoc_client_new("mongodb://用户名:密码@地址:端口") - 示例:带认证的连接
mongoc_client_t *client = mongoc_client_new("mongodb://admin:123456@localhost:27017");
- BSON 文档操作
bson_t *doc = BCON_NEW("name", BCON_UTF8("李四"), "score", BCON_DOUBLE(95.5));
bson_t *doc = BCON_NEW("user", "{", "name", "王五", "address", "{", "city", "北京", "}", "}");
- 增删改查操作
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);
常见问题处理
- 连接失败
- 确保 MongoDB 服务已启动:
systemctl start mongod(Linux) - 检查防火墙是否开放 27017 端口
- 编译错误
- 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
- 内存泄漏
- 确保每个
_new 或 _create 创建的指针都有对应的 _destroy 或 _free
- 调试输出
export MONGOC_TRACE=ENABLED
./example
进阶参考
- 官方文档:libmongoc API
- 高级功能:连接池、批量写入、聚合管道、索引管理
- 性能优化:使用
mongoc_client_pool_t 实现连接池