如何收集mongodb::光标变成一个Vec在 rust

axzmvihb  于 2022-11-12  发布在  Go
关注(0)|答案(2)|浏览(155)

我尝试在mongodb中使用.find()方法。输出结果是mongodb::Cursor。我无法将光标转换为向量,以便将其 Package 在json中并发送到前端。这是我尝试过的以下想法

以下错误消息为:

the trait bound `Vec<user_model::User>: Extend<Result<user_model::User, mongodb::error::Error>>` is not satisfied\nthe following other types implement trait `Extend<A>`

我已经包含了use futures::StreamExt;use futures::TryFutureExt;,并尝试了.try_next().map()而不是.collect(),但仍然无法解析它

2j4z5cfb

2j4z5cfb1#

将游标中的元素转换为User可能会失败。只能将Result.collect()收集到Vec中。

let serial: Vec<Result<User, _>> = users.collect().await;

这里使用Vec<User>的最简单的方法是使用.try_collect()。只要确保正确处理Err,而不是像我在这里所做的那样只使用unwrap

let serial: Vec<User> = users.try_collect().await.unwrap();
mf98qq94

mf98qq942#

下面是我在我的一个项目中是如何处理这个问题的。我只是简单地调用next遍历游标,并将每一项推入一个向量中。我使用Document类型来收集结果。对每个结果使用一个匹配允许正确地处理错误,因为提取可能会失败。

let mut results: Vec<Document> = Vec::new();

while let Some(result) = cursor.next().await {
    match result {
        Ok(document) => {
            results.push(document);
        }
        _ => {
            return HttpResponse::InternalServerError().finish();
        }
    }
}

相关问题