使用 MongoDB 的 Rust 驱动程序访问嵌套结构中的数据的最佳方法是什么,所有这些都是可选的?
What is the best way to access data within nested structs, all of which are Optional using MongoDB's Rust driver?
我有一组嵌套的结构,所有数据都是可选的。结构类似于以下内容(为简单起见,我删除了一些 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 就足够了,因为该值用于表示应用程序结构中的错误。嵌套的匹配语句工作正常 - 只是有点冗长。
或者,我也可以只使用聚合管道来获取值。我只是对替代方案感到好奇。
谢谢。
您可以使用 and_then
将函数应用于包含的 Ok
值,并保持 None
不变。例如,设想以下结构:
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)
我有一组嵌套的结构,所有数据都是可选的。结构类似于以下内容(为简单起见,我删除了一些 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 就足够了,因为该值用于表示应用程序结构中的错误。嵌套的匹配语句工作正常 - 只是有点冗长。
或者,我也可以只使用聚合管道来获取值。我只是对替代方案感到好奇。
谢谢。
您可以使用 and_then
将函数应用于包含的 Ok
值,并保持 None
不变。例如,设想以下结构:
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)