如何解决如果在 Rust 中使用 skip_serialize serde 属性,则无法将字段写入 MongoDB 文档
我希望能够将一个字段写入 mongo 文档,但在将对象作为响应传递给客户端时避免序列化它。
我尝试使用 #[serde(skip_serializing)]
。
但是,它没有按我的预期工作,我认为这是因为当它使用 mongo 库中的 to_document
转换 Region
时,它会使用 skip 属性进行序列化,因为它还使用了 serde 序列化程序.如果我在这里错了,请纠正我。
我有两个结构定义如下:
#[serde(rename_all = "camelCase")]
#[derive(Serialize,Deserialize,Debug)]
pub struct Region {
#[serde(alias = "_id")]
pub id: Option<i32>,pub name: String,...
pub areas: Vec<Area>,...
}
#[serde(rename_all = "camelCase")]
#[derive(Serialize,Debug)]
pub struct Area {
pub id: Option<String>,#[serde(skip_serializing)]
pub ext_api_id: Option<String>,}
在插入后手动检查文档时,没有 extApiId
字段。
我尝试通过键(类似于 document.insert("_id",id)
)手动将其添加到生成的文档中,但我找不到也无法弄清楚如何通过键字符串访问数组中的字段。理想情况下,我希望无论如何都不必这样做。
pub async fn update(&self,id: i32,mut region: Region) -> Result<i32,Box<dyn Error>> {
for mut area in &mut region.areas {
area.id = Some(get_slug_from_name(area.name.clone()));
}
let mut document = to_document(®ion)?;
document.remove("id");
document.insert("_id",id);
self.collection
.update_one(
doc! { "_id": id },document,UpdateOptions::builder().upsert(Some(true)).build(),)
.await?;
Ok(id)
}
有关如何解决此问题的任何建议?我想过 Area
和 InsertableArea
没有 field 属性,我想我还需要一个 InsertableRegion
。
解决方法
显然如果你要求serde不序列化这个字段,那么这个字段无论如何都不会被序列化。
如果你的一个数据有一个额外的字段,那就是不相同的数据,所以你需要两个结构。
巧妙使用 serde flatten 的示例:
#[serde(rename_all = "camelCase")]
#[derive(Serialize,Deserialize,Debug)]
pub struct Area {
pub id: Option<String>,pub name: String,}
#[serde(rename_all = "camelCase")]
#[derive(Serialize,Debug)]
pub struct AreaAPI {
#[serde(flatten)]
pub area: Area,pub ext_api_id: Option<String>,}
另一种解决方案可能是使用 skip_serializing_none
,但我认为这不是您的用例的最佳解决方案。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。