MongoDB的c++封装api

为了方便使用,用mongodb的c驱动写了个访问mongodb的c++api接口。提供了bson参数和json参数作为函数实参的一些api。下面列出一些基础的api接口,而逻辑接口是在这些基础接口上使用的。所有的api接口以成员函数的形式存在于lbs代理会话对象中。该对象保存连接到mongodb实例的长连接。以后如若要做地理分片也可以在改会话对象中哈希到不同分片的mongodb实例。

对于很多系统是提供json形式的数据的,提供json参数的api能更容易开发逻辑。bson格式是mongodb的数据传输形式,也是mongodb 的c驱动api提供的原生参数,直接使用bson参数接口有利于提高处理效率。

下面列出的api的使用方式在注释中也注明了。

相关的mongodb的c驱动,可参考官方文档mongoc api:http://api.mongodb.org/c/current/

1.初始化连接

配置数据库连接,在初始化时建立长连接

bool LbsProxySession::Init(const loss::CJsonObject& conf)
{
    if (boInit)
    {
        return true;
    }
    std::string dbip;
    int dbport;
    if (!conf.Get("dbip", dbip) || !conf.Get("dbport", dbport)
                    || !conf.Get("group_dbname", group_dbname)
                    || !conf.Get("group_tbname", group_tbname)
                    || !conf.Get("user_dbname", user_dbname)
                    || !conf.Get("user_tbname", user_tbname)
                    || !conf.Get("near_dis", near_dis))
    {
        return false;
    }
    snprintf(connectStr, sizeof(connectStr), "mongodb://%s:%d/", dbip.c_str(),
                    dbport);
    mongoc_init();
    client = mongoc_client_new(connectStr); //"mongodb://localhost:27017/"
    if (!client)
    {
        return false;
    }
    boInit = true;
    return true;
}



2.bson参数操作数据库CRUD

2.1插入请求 

/*
 (1)构建请求
 bson_oid_t oid;
 bson_t *doc;
 doc = bson_new ();
 bson_oid_init (&oid, NULL);
 BSON_APPEND_OID (doc, "_id", &oid);//文档id
 BSON_APPEND_UTF8 (doc, "hello", "world");//hello字段
 (2)插入操作
 InsertDoc("mydb", "mycoll",doc)
 (3)销毁请求
 bson_destroy (doc);
 * */
bool LbsProxySession::InsertDoc(const char*db, const char*tb, const bson_t *doc)
{
    mongoc_collection_t *collection = mongoc_client_get_collection(client, db,
                    tb); //插入到数据库db的集合coll中
    if (!mongoc_collection_insert(collection, MONGOC_INSERT_NONE, doc, NULL,
                    &error))
    {
        char *docStr = bson_as_json(doc, NULL);
        LOG4CPLUS_ERROR_FMT(GetLogger(),
                        "mongoc_collection_insert failed,cond:%s,error: %s\n",
                        docStr, error.message);
        bson_free(docStr);
        mongoc_collection_destroy(collection);
        return false;
    }
    mongoc_collection_destroy(collection);
    return true;
}


2.2查询操作

/*
 (1)查询条件
 bson_t *cond;
 cond = bson_new ();
 mongoc_cursor_t *cursor(NULL);
 (2)查询,返回游标cursor
 SearchDocs("mydb","mycoll",cond,cursor)
 (3)获取查询结果
 const bson_t *doc;
 char *str;
 while (mongoc_cursor_next (cursor, &doc)) {
     str = bson_as_json (doc, NULL);
     printf ("%s\n", str);
     bson_free (str);
 }
 (4) 销毁请求句柄
 bson_destroy (cond);
 mongoc_cursor_destroy (cursor);
 * */
bool LbsProxySession::SearchDocs(const char*db, const char*tb,
                const bson_t *cond, mongoc_cursor_t *&cursor, unsigned int skip,
                unsigned int limit, unsigned int batch_size,
                const bson_t *fields)
{
    mongoc_collection_t *collection = mongoc_client_get_collection(client, db,
                    tb);
    cursor = mongoc_collection_find(collection, MONGOC_QUERY_NONE, skip, limit,
                    batch_size, cond, fields, NULL); //获取查询对象查询后的结果
    if (!cursor)
    {
        char *condStr = bson_as_json(cond, NULL);
        LOG4CPLUS_ERROR_FMT(GetLogger(),
                        "SearchDocs mongoc_collection_find failed,cond:%s,error: %s\n",
                        condStr, error.message);
        bson_free(condStr);
        mongoc_collection_destroy(collection);
        return false;
    }
    mongoc_collection_destroy(collection);
    return true;
}


2.3更新操作

条件查询

/*
 (1)更新条件和更新数据,如db.a.update({"_id" : ObjectId("55ef549236fe322f9490e17b")},{"$set":{"key":"new_value","updated":true}})
 bson_t *cond = BCON_NEW ("_id", BCON_OID (&oid));//条件为id "_id" : ObjectId("55ef549236fe322f9490e17b")
 bson_t *updatedoc = BCON_NEW ("
  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
最近重构并优化了一套后端服务的代码: 1. 设计并开发高效的C++对象池算法,时间复杂度为 O(1) 在整个重构框架中,对象池是负责管理内存的底层基本模块 2. 利用命令模式的思想开发 Redis 子模块 抽象出方便高效的接口提供给上层程序员使用 3. 利用组合模式和装饰模式的思想开发 MongoDB 数据库查询条件装饰器 将查询条件和数据库 MongodbModule 数据模型进行解耦合 4. 抽象出一套 MongoDB Module 结果集接口 通过模板和特化技术实现 string/int 等不同索引类型的结果集 5. 开发 AbstractMongodbModule 类处理通用的 MongoDB 数据库表数据操作 数据库中不同的表都有自己的 AbstractMongodbModule 子类对应 6. 用 Perl 开发自动代码生成器,上层程序员对照数据库表结构写 .tmpl 配置文件, 自动生成该数据库表的 MongodbModule 子类,减轻程序员新增表时的工作量 7. 结合 Redis 模块和 MongoDB 模块,开发 HierarchicalModule 分层数据模型 构造一个 Redis 缓存层 + MongoDB 持久层的后台 Server 架构 并通过简单方便的接口供上层程序员使用,具体的数据分层处理对上层程序员是黑盒的 8. 设计并开发整套缓存层使用的 KEY 规则,方便缓存更新 结合公司的数据订阅系统进行 Redis缓存层 + MongoDB 持久层数据更新功能 9. 重构后的分层数据架构比原有接口效率提高 5 - 400 倍(返回数据记录条数从 150 - 5 条) 绝大部分时间后端接口需要获取记录个数在 50 以内,所以效率提升在 100 倍左右

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值