2016-12-08 9 views
0

私はbsonでエンコードされたファイルを読むためのC関数を書いています。私は配列のキーを見つけようとしています。私はキーが存在することを知っています、なぜならbsondumpはそれと配列を出力するからです。 "vol"を検索すると、bson_iter_find()はfalseを返します。BSONオブジェクトの配列へのキーを見つけることができません

はここで機能だ:

static int nas_initalize(const char *path) 
{ 
    int error = 0; 
    bson_reader_t *reader = bson_reader_new_from_file(path, &bson_error); 
    if (!reader) { 
    fprintf (stderr, "ERROR: %d.%d: %s\n", 
      bson_error.domain, bson_error.code, bson_error.message); 
    } 
    super_block = bson_reader_read(reader, NULL); 
    bson_iter_init(&iter, super_block); 

    if (bson_iter_find(&iter, "max_dir")) 
    { 
     max_dir = bson_iter_int32(&iter); 
    } 
    else 
    { 
     error = -1; 
     bson_reader_destroy(reader); 
    } 

    if (bson_iter_find(&iter, "raid_lv")) 
    { 
     raid_lv = bson_iter_int32(&iter); 
    } 
    else 
    { 
     error = -1; 
     bson_reader_destroy(reader); 
    } 

    if(bson_iter_find(&iter, "vol")) 
    { 
     int count = 0; 
     bson_iter_recurse(&iter, sub_iter); 
     while(bson_iter_next(sub_iter) == true) 
     { 
      if (bson_iter_find_descendant(&iter, "vol.0", sub_iter)) 
      { 
       vol[count++] = bson_iter_utf8 (sub_iter, NULL); 
      } 
     } 
    } 
    else 
    { 
     error = -1; 
     bson_reader_destroy(reader); 
    } 

    bson_reader_destroy(reader); 

    return error; 
} 

答えて

0

複数bson_iter_findを行っている()コマンドとあなたは右のあなたが望むデータ上でホッピングしている可能性があります。

すべての検索でiterオブジェクトを再初期化する必要があります。また、bsonドキュメントにシリアル化されているため、findの呼び出し順序を正確にする必要があります。

参照: Does order matter in bson_iter_find in mongo c driver

関連する問題