CentOS7.5下使用Docker安装MongoDB及C使用mongo-c-driver-1.18.0操作MongoDB
1 Docker安装MongoDB及简单使用
安装镜像参考:https://www.runoob.com/docker/docker-install-mongodb.html.
1、docker下载MongoDB镜像:docker pull mongo
2、查看镜像:docker images
3、运行容器:docker run -itd --name mongo -p 27017:27017 mongo --auth
4、查看容器运行信息:docker ps -a
5、登录MongoDB并且创建用户名密码及简单使用:
(1)登录MongoDB:docker exec -it mongo mongo admin
(2)创建用户名密码:db.createUser({ user:‘admin’,pwd:‘123456’,roles:[ { role:‘userAdminAnyDatabase’, db: ‘admin’},“readWriteAnyDatabase”]});
(3)使用用户名密码认证:db.auth(‘admin’, ‘123456’)
(4)查看所有数据库:show dbs
(5)创建数据库(test不存在则自动创建):use test
(6)插入两条文档自动创建数据集user:
db.user.insert({name: ‘zhangsan’, age: ‘20’});
db.user.insert({name: ‘lisi’, age: ‘20’});
(7)查询user数据集文档:db.user.find().pretty()
(8)通过limit查询指定数量的文档:db.user.find().limit(1).pretty()
(9)修改数据集:db.user.update({‘name’:‘zhangsan’},{$set:{‘age’:‘50’}})
(10)查询修改后的user数据集:db.user.find().pretty()
(11)删除文档:db.user.remove({‘name’:‘zhangsan’})
(12)查看所有数据集:show collections
(13)删除指定数据集:db.user.drop()
2 C使用mongo-c-driver-1.18.0操作MongoDB
2.1mongo-c-driver-1.18.0驱动安装
因为我们使用的是最新版本的MongoDB5.0,所以需要安装1.18版本的驱动,Github上下载源码手工编译安装驱动。
驱动源码方式安装参考:http://mongoc.org/libmongoc/current/installing.html
$ wget https://github.com/mongodb/mongo-c-driver/releases/download/1.18.0/mongo-c-driver-1.18.0.tar.gz
$ tar xzf mongo-c-driver-1.18.0.tar.gz
$ cd mongo-c-driver-1.18.0
$ mkdir cmake-build
$ cd cmake-build
$ cmake -DENABLE_AUTOMATIC_INIT_AND_CLEANUP=OFF …
1、执行cmake提示需要CMake 3.1以上版本,所以下载安装CMake3:yum install -y cmake3
2、cmake -DENABLE_AUTOMATIC_INIT_AND_CLEANUP=OFF …需要改为(cmake改为cmake3)cmake3 -DENABLE_AUTOMATIC_INIT_AND_CLEANUP=OFF …
3、编译时提示需要OpenSSL依赖,所以需要安装OpenSSL:yum install openssl openssl-devel
错误信息如下:
4、编译成功后信息如下:
5、继续执行make编译,编译成功信息如下:
6、安装make install,安装成功信息如下:
libbson-1.0信息如下:
头文件目录:/usr/local/include/libbson-1.0/
动态库目录:/usr/local/lib64/
libmongoc-1.0信息如下:
头文件目录:/usr/local/include/libmongoc-1.0/
动态库目录:/usr/local/lib64/
2.2C语言操作MongoDB简单示例
参考mongo-c-driver-1.18.0/src/libmongoc/examples/example-client.c
/* gcc mongo_test.c -I /usr/local/include/libmongoc-1.0/ -I /usr/local/include/libbson-1.0/ -o mongo_test -lmongoc-1.0 -lbson-1.0 */
/* ./mongo_test [CONNECTION_STRING [DATABASE_NAME] [COLLECTION_NAME]] */
#include <mongoc.h>
#include <stdio.h>
#include <stdlib.h>
#define MONGO_DEFAULT_USERNAME "admin"
#define MONGO_DEFAULT_PASSWORD "123456"
#define MONGO_DEFAULT_HOST "127.0.0.1"
#define MONGO_DEFAULT_PORT "27017"
#define MONGO_DEFAULT_AUTH_SOURCE "admin"
#define MONGO_DEFAULT_DATABASE "test"
#define MONGO_DEFAULT_COLL "user"
#include <mongoc/mongoc.h>
#include <stdio.h>
#include <stdlib.h>
int
main(int argc, char* argv[])
{
mongoc_client_t* client;
mongoc_collection_t* collection;
mongoc_cursor_t* cursor;
bson_error_t error;
const bson_t* doc;
//默认数据库与数据集
const char* database_name = MONGO_DEFAULT_DATABASE;
const char* collection_name = MONGO_DEFAULT_COLL;
bson_t query;
char* str;
char uri_default[128] = { 0 };
//修改URI默认格式
snprintf(uri_default, sizeof(uri_default), "mongodb://%s:%s@%s:%s/?authSource=%s", MONGO_DEFAULT_USERNAME, MONGO_DEFAULT_PASSWORD, MONGO_DEFAULT_HOST,
MONGO_DEFAULT_PORT, MONGO_DEFAULT_AUTH_SOURCE);
//const char* uri_string = "mongodb://127.0.0.1/?appname=client-example";
const char* uri_string = uri_default;
mongoc_uri_t* uri;
mongoc_init();
if (argc > 1) {
uri_string = argv[1];
}
if (argc > 2) {
database_name = argv[2];
}
if (argc > 3) {
collection_name = argv[3];
}
uri = mongoc_uri_new_with_error(uri_string, &error);
if (!uri) {
fprintf(stderr,
"failed to parse URI: %s\n"
"error message: %s\n",
uri_string,
error.message);
return EXIT_FAILURE;
}
fprintf(stdout, "uri:<%s>,database_name:<%s>,collection_name:<%s>\n", uri_string, database_name, collection_name);
client = mongoc_client_new_from_uri(uri);
if (!client) {
return EXIT_FAILURE;
}
mongoc_client_set_error_api(client, 2);
bson_init(&query);
collection = mongoc_client_get_collection(client, database_name, collection_name);
cursor = mongoc_collection_find_with_opts(
collection,
&query,
NULL, /* additional options */
NULL); /* read prefs, NULL for default */
while (mongoc_cursor_next(cursor, &doc)) {
str = bson_as_canonical_extended_json(doc, NULL);
fprintf(stdout, "%s\n", str);
bson_free(str);
}
if (mongoc_cursor_error(cursor, &error)) {
fprintf(stderr, "Cursor Failure: %s\n", error.message);
return EXIT_FAILURE;
}
bson_destroy(&query);
mongoc_cursor_destroy(cursor);
mongoc_collection_destroy(collection);
mongoc_uri_destroy(uri);
mongoc_client_destroy(client);
mongoc_cleanup();
return EXIT_SUCCESS;
}
1、编译:gcc mongo_test.c -I /usr/local/include/libmongoc-1.0/ -I /usr/local/include/libbson-1.0/ -o mongo_test -lmongoc-1.0 -lbson-1.0
2、将libbson与libmongoc依赖库拷贝到/lib64/目录下,因为/usr/local/lib64/不是动态库默认搜索路径
cp -a /usr/local/lib64/libbson* /lib64/
cp -a /usr/local/lib64/libmongoc* /lib64/
3、重新添加几条数据测试
db.user.insert({name: ‘zhangsan’, age: ‘20’});
db.user.insert({name: ‘lisi’, age: ‘20’});
db.user2.insert({name: ‘zhangsan’, age: ‘20’});
4、默认执行:./mongo_test
5、指定参数(URI、数据库名称、数据集名称)执行:./mongo_test mongodb://admin:123456@127.0.0.1:27017/?authSource=admin test user2