如果在 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(&region)?;
        document.remove("id");
        document.insert("_id",id);

        self.collection
            .update_one(
                doc! { "_id": id },document,UpdateOptions::builder().upsert(Some(true)).build(),)
            .await?;
        Ok(id)
    }

有关如何解决此问题的任何建议?我想过 AreaInsertableArea 没有 field 属性,我想我还需要一个 InsertableRegion

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)