1、實(shí)現(xiàn)原理
為了實(shí)現(xiàn)自增ID,,需要引入專門計(jì)算id的Collection。
該collection中存放的記錄格式類似如下:
{'_id': 1, 'current_id_value':1} ,
其中current_id_value對(duì)應(yīng)著當(dāng)前最大id值+1,每次需要獲取一個(gè)ID時(shí),需要先到該collection查詢對(duì)應(yīng)的currentIdValue 值并把這個(gè)值+1
mongodb提供了findAndModify接口,并且是線程安全的,做到查詢并加1的原子操作。
2、代碼如下
int64_t GetID()
{
int64_t ret = -1;
mongoc_collection_t *pCountCollection = mongoc_client_get_collection(m_pClient, "test_db", "id_generator");
bson_error_t error;
bson_t *doc = bson_new();
bson_t child;
bson_append_document_begin(doc, "$inc", -1, &child);
BSON_APPEND_INT64(&child, "current_id_value", 1);
bson_append_document_end(doc, &child);
bson_t query;
bson_init(&query);
BSON_APPEND_INT64(&query, "_id", 1);
bson_t reply;
bool r = mongoc_collection_find_and_modify(pCountCollection,
&query,
NULL,
doc,
NULL,
false,
true,
true,
&reply,
&error);
if (!r)
{
cout << "GetID Failure: " << error.message;
}
else
{
bson_iter_t iter;
bson_iter_init(&iter, &reply);
if (bson_iter_find(&iter, "value"))
{
const uint8_t *buf;
uint32_t len;
bson_iter_document(&iter, &len, &buf);
bson_t rec;
bson_init_static(&rec, buf, len);
bson_iter_init(&iter, &rec);
if (bson_iter_find(&iter, "current_id_value"))
{
ret = bson_iter_int64(&iter);
}
bson_destroy(&rec);
}
}
bson_destroy(&query);
bson_destroy(&reply);
bson_destroy(doc);
return ret;
}
posted on 2014-09-27 16:23
merlinfang 閱讀(3906)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
mongodb