2015-06-19 64 views
2

我使用C語言編寫了以下用於使用C mongodb驅動程序的代碼。如何使用Mongodb C驅動程序獲取mongodb數組中元素的數量?

else if (0 == strcmp(key, "Records")){ 
      printf("-------------Records-------------\n"); 
      if (BSON_ITER_HOLDS_ARRAY(&iter)) { 
       bson_iter_array(&iter, &array_len,&array); 
       bson_iter_recurse(&iter, &child); 
       while (bson_iter_next(&child)) { 
        key = bson_iter_key(&child); 
        if (BSON_ITER_HOLDS_DOCUMENT(&child)){ 
         ReadRecords(&child); 
        } 
       } 
      } 
     } 

基本上我試圖從mongodb讀取文件。 docuemnt的結構是這樣的快照:http://1drv.ms/1BAXAOx

但是對於我的api pupose我想知道數組的大小,然後開始迭代通過每個元素並以我的格式使用它。

正如你可以看到我已經試過bson_iter_array(& ITER,& array_len,&陣列);但是我認爲這不是我想要的。這裏是它的文檔http://api.mongodb.org/libbson/current/bson_iter_array.html。其中array_len實際上是「緩衝區長度的位置」。

那麼有人可以幫助如何獲取MongoDB數組的迭代通過文件時的數組數量。

由於

+0

您是否找到答案?我也有同樣的問題。我所能想到的是迭代一次通過文檔來計算元素並第二次處理它們。我猜bson格式不包括數組數,所以這是內部無論如何都需要發生的事情。 – user1055568

+0

嗨,是的,你是對的,我們必須循環它。只是我的意見C驅動程序是醜陋的,特別是如果你曾與C#驅動程序工作。我回到了C#驅動程序,因爲我沒有發現任何主要的性能增益。 – Sherry

回答

2

bson_count_keys(bson_t * b)的。如果B點元件的數量返回到一個數組。我猜想需要從內部讀取整個數組。如果你只需要對內存預分配進行粗略估計,那麼b-> len給出了數組中的字節數,如果元素大小不變,從中可以得出一個粗略的想法。我猜想這是從bson_iter_array()獲得的相同數字。

0

mongo C驅動程序文檔在這裏有點欠缺,並且迫使您深入研究代碼。下面顯示了bson_iter_array的定義。請注意,*array_len**array是輸出。

void 
bson_iter_array (const bson_iter_t *iter,  /* IN */ 
       uint32_t   *array_len, /* OUT */ 
       const uint8_t  **array)  /* OUT */ 
{ 
    bson_return_if_fail (iter); 
    bson_return_if_fail (array_len); 
    bson_return_if_fail (array); 

    *array = NULL; 
    *array_len = 0; 

    if (ITER_TYPE (iter) == BSON_TYPE_ARRAY) { 
     memcpy (array_len, (iter->raw + iter->d1), sizeof (*array_len)); 
     *array_len = BSON_UINT32_FROM_LE (*array_len); 
     *array = (iter->raw + iter->d1); 
    } 
} 
相關問題