使用 MongoDB 的 Rust 驱动程序访问嵌套结构中的数据的最佳方式是啥,所有这些都是可选的?

Posted

技术标签:

【中文标题】使用 MongoDB 的 Rust 驱动程序访问嵌套结构中的数据的最佳方式是啥,所有这些都是可选的?【英文标题】:What is the best way to access data within nested structs, all of which are Optional using MongoDB's Rust driver?使用 MongoDB 的 Rust 驱动程序访问嵌套结构中的数据的最佳方式是什么,所有这些都是可选的? 【发布时间】:2021-12-25 11:59:06 【问题描述】:

我有一组嵌套的结构,所有数据都是可选的。结构类似于以下内容(为简单起见,我删除了一些 Optionals):

#[derive(Debug, Serialize, Deserialize)]
pub struct Device 
    #[serde(rename = "_id")]
    pub id: Option<bson::oid::ObjectId>,
    pub system: Option<System>,

#[derive(Debug, Serialize, Deserialize)]
pub struct System 
    pub id: Option<u32>,
    pub mac: Option<String>,

当我查询数据库时,我得到了数据:

Ok(Some(Device  id: Some(ObjectId("...")),  system: Some(System  id: Some(123), mac: Some("1234") )))

我正在尝试访问 System 结构中的 id 值。我可以使用一些嵌套的匹配语句轻松访问它,但我想知道是否有更简单的解决方案。我一直在查看 unwrap_or、unwrap_or_else,但我无法正确获取语法。理想情况下,返回 0 就足够了,因为该值用于表示应用程序结构中的错误。嵌套的匹配语句工作正常 - 只是有点冗长。

或者,我也可以只使用聚合管道来获取值。我只是对替代品感到好奇。

谢谢。

【问题讨论】:

如果它的所有内部字段也是 Option ,为什么要把 Option 放在 System 上? @stargateur 此结构中的数据是根据从设备接收到的遥测数据动态构建(和更新)的。第一次在数据库中创建结构时,系统可能不存在。我没有提供问题中所有结构的完整描述以保持简洁。 并没有改变我的话。唯一可以解决我的评论的就是在系统中放置一个非选项字段 【参考方案1】:

您可以使用and_then 将函数应用于包含的Ok 值,并保持Nones 不变。例如,想象以下结构:

struct Foo 
    bar: Option<Bar>


struct Bar 
    baz: Option<Baz>


struct Baz 
    value: Option<i32>

然后您可以像这样查询嵌套数据:

fn read_value(foo: Foo) -> Option<i32> 
    foo.bar
        .and_then(|bar| bar.baz) 
        .and_then(|baz| baz.value)

如果Option中的任何一个是None,则整个表达式为None,否则为包含的Some(value)

【讨论】:

以上是关于使用 MongoDB 的 Rust 驱动程序访问嵌套结构中的数据的最佳方式是啥,所有这些都是可选的?的主要内容,如果未能解决你的问题,请参考以下文章

Rust交叉编译和不依赖glic之类的编译(内嵌这些依赖库)

mongoDB在java中怎么根据内嵌文档条件查询

使用 arrayFilters 更新 MongoDB 中的嵌套子文档

匹配 MongoDB 中嵌套子文档的嵌套数组

如何在不同深度内搜索 MongoDB 嵌套子文档

如何在不同深度内搜索 MongoDB 嵌套子文档