Unset элемент документа в Mongo CXX - PullRequest
1 голос
/ 24 июня 2019

У меня есть класс с bsoncxx::document::view view атрибутом private и метод, который получает документ из базы данных Mongo и сохраняет результат в локальной переменной bsoncxx::document::value value, а затем получает представление из value.view() и сохраните его в переменной класса bsoncxx::document::view view:

const bool User::search_one_by_id(const std::string &id = "")
{
    // The prototype of the method below: const std::tuple<bool, bsoncxx::document::value> search_one_by_id(mongocxx::collection &, const std::string &) const;
    auto status = Crud::search_one_by_id(this->collection, id);

    if (std::get<0>(status))
    {
        // Error
        return EXIT_FAILURE;
    }
    else
    {
        // Success
        bsoncxx::document::value value = std::get<1>(status);

        bsoncxx::document::view view = value.view();

        this->view = view;

        return EXIT_SUCCESS;
    }
}

Проблема в том, что если я получу какой-то элемент из представления в методе выше, то есть код ниже перед return EXIT_SUCCESS, нетвыдаются ошибки.

        bsoncxx::document::element element = this->view["first_name"];

        std::cout << "First Name: " << element.get_utf8().value.to_string();

Но если я получаю представление, сохраните его в переменной bsoncxx::document::view view и попытайтесь получить какой-либо элемент из представления в другом методе класса:

void get_element()
{
    bsoncxx::document::element element = this->view["first_name"];

    std::cout << "First Name: " << element.get_utf8().value.to_string();
}

Я получаю сообщение об ошибке:

terminate called after throwing an instance of 'bsoncxx::v_noabi::exception'
  what():  unset document::element
Makefile:26: recipe for target 'run' failed
make: *** [run] Aborted (core dumped)

Я пытался использовать указатель, чтобы сохранить ссылку на представление, которое я получаю в методе search_one_by_id.Я проверил, является ли тип атрибута (first_name), который я получаю, правильным типом, чтобы получить значение элемента.Я должен был проверить, существует ли атрибут в документе.Я пытался использовать метод release() из view в User::search_one_by_id.Я проверил, пусто ли представление через:

if (this->view.empty())
{
    std::cout << "Empty: " << this->view.empty();
}
else
{
    std::cout << "Loaded: " << this->view.empty() << " length " << this->view.length();
}

Внутри метода get_element, и вывод:

# If I comment the call to search_one_by_id
$ Empty: 1

# If I enable the call to search_one_by_id
$ Loaded: 0 length 129

Журнал GDB на backtrace:

#0  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
#1  0x00007ffff6fd7801 in __GI_abort () at abort.c:79
#2  0x00007ffff762c957 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#3  0x00007ffff7632ab6 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#4  0x00007ffff7632af1 in std::terminate() () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#5  0x00007ffff7632d24 in __cxa_throw () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#6  0x00007ffff793985c in bsoncxx::v_noabi::document::element::type() const () from /usr/local/lib/libbsoncxx.so._noabi
#7  0x00007ffff7939abc in bsoncxx::v_noabi::document::element::get_utf8() const () from /usr/local/lib/libbsoncxx.so._noabi
#8  0x0000555555559353 in User::get_element() ()
#9  0x0000555555556668 in main ()

Несколько советов?Проект можно найти на Github

Ссылки:

Unset Document :: element, MongoCXX Find Option Projection

Значение документа

Просмотр документа

Элемент документа

document :: element ::Перегрузки оператора [] не должны выдаваться, если задан недопустимый элемент

Как получить тип переменной?

1 Ответ

1 голос
/ 24 июня 2019

Я думаю, вам нужно где-то хранить указатель на буфер значений. вид объекта указывает на удаленную память, я полагаю. попробуйте что-то вроде этого

class User
{
   bsoncxx::document::value _value;   <<< store at class level
};

const bool User::search_one_by_id(const std::string &id = "")
{
    // The prototype of the method below: const std::tuple<bool, bsoncxx::document::value> search_one_by_id(mongocxx::collection &, const std::string &) const;
    auto status = Crud::search_one_by_id(this->collection, id);

    if (std::get<0>(status))
    {
        // Error
        return EXIT_FAILURE;
    }
    else
    {
        // Success
        _value = std::get<1>(status);
        this->view = _value.view();

        return EXIT_SUCCESS;
    }
}
...