2012-10-11 53 views
0

我想爲使用C驅動程序的mongo實現一個tailable光標。 Uptil現在我已經能夠創建併成功地獲得數據推到我的過程用下面的代碼Mongodb:在最新的「_id」c驅動程序中的Tailable光標

cursor =mongo_find(connection, DB_TENANT_NAMESPACE, query, bson_empty(&e), 0, 0, MONGO_TAILABLE | MONGO_AWAIT_DATA); 
while(1) 
{ 
    while(mongo_cursor_next(cursor) == MONGO_OK) 
    { 
     b=mongo_cursor_bson(cursor); 
     if(bson_find(iterator,b,"_id")) 
     { 
     oid =bson_iterator_oid(iterator); 
     bson_oid_to_string(oid,&id); 
     printf("ID:%s\n",id); 
     } 

} 

有了這個代碼,我可以得到更新。但看看tailable遊標文檔,似乎我需要在外部while循環內運行mongo_find以確保我獲得最新的條目。該文檔建議附加查詢gte。從文檔複製

query = QUERY("_id" << GT << lastId).sort("$natural"); 

問題是oid是可以轉換爲字符串的對象。我真的不認爲我應該將其轉換爲int按順序爲gte工作。有任何想法嗎?

回答

1

ObjectId可能由這些操作符在邏輯上進行比較,Date和Timestamp對象也是如此。應該不需要將ObjectId表示爲字符串,並且將ObjectId與字符串進行比較沒有實際的理由(至少在這種情況下)。

請注意,涉及兩種不同BSON類型的比較將遵循this compare order

+0

我只是將其轉換爲字符串來打印它。真正的問題是是否將查找查詢放在while循環內部或外部。在C++驅動程序的情況下,遊標有一個字段「is_dead」來檢查它是否死了。我沒有看到任何這樣的事情在C driver.Do''mongo_cursor_next'處理這種情況? – auny

+1

等效於is_dead的C驅動程序用於檢查MONGO_CURSOR_EXHAUSTED的遊標錯誤,例如,像... int is_dead(mongo_cursor * cursor){return cursor-> err == MONGO_CURSOR_EXHAUSTED; } –

+0

@GaryMurakami是上面的代碼,足以正確實現可放大的遊標,或者我應該對'MONGO_CURSOR_EXHAUSTED'進行測試,並在循環中查詢它是否死亡 – auny

相關問題