Почему сопоставление по результату `find_one` возвращает Option вместо ожидаемого типа? - PullRequest
0 голосов
/ 27 июня 2019

Я пытаюсь использовать метод .get для BSON OrderedDocument, который я получаю из запроса MongoDB. Для обработки любых ошибок в запросе я использую оператор match в запросе.

let id: String = "example".to_string();

let doc = match db.media.find_one(
    Some(doc! {
        "id" : id
    }),
    None,
) {
    Ok(c) => c,
    Err(e) => {
        // do stuff with the error
        return;
    }
};

println!("{:?}", doc.get("field"));

Возвращает ошибку для последней строки:

ошибка [E0599]: метод с именем get не найден для типа std::option::Option<bson::ordered::OrderedDocument> в текущей области

Это должно означать, что тип, возвращаемый из операции match, является Option, а не OrderedDocument, как я ожидал. Почему переменная c возвращает (в приведенном выше примере) тип Option вместо типа документа BSON запроса, и как я могу получить требуемый тип, возвращаемый из match? Или это неправильный путь?

1 Ответ

3 голосов
/ 27 июня 2019

Тип, возвращаемый операцией match, это то, что вы в нее вставили.В этом случае типом является c.

find_one возвращает Result<Option<Document>>.Поскольку ваши паттерны совпадают только в части Result, вы получаете внутреннюю Option.Одним из решений является использование более точных шаблонов:

let doc = match db.media.find_one(Some(doc! { "id": id }), None) {
    Ok(Some(c)) => c,
    Ok(None) => {
        println!("Nothing found");
        return;
    }
    Err(e) => {
        println!("An error occurred: {:?}", e);
        return;
    }
};
...