为了方便使用,用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 ("