2016-12-08 6 views
0

Я пишу функцию C для чтения кодированного файла bson. Я пытаюсь найти ключ к массиву. Я знаю, что ключ существует, потому что bsondump распечатает его и массив. bson_iter_find() возвращает false при поиске "vol".Не удается найти ключ для массива в объекте 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.

Does order matter in bson_iter_find in mongo c driver