mongodb - 如果在 Rust 中使用 skip_serialize serde 属性,则无法将字段写入 MongoDB 文档
问题描述
我希望能够将字段写入 mongo 文档,但在将对象作为响应传递给客户端时避免对其进行序列化。
我尝试使用#[serde(skip_serializing)]
. 但是,它并没有按我的预期工作,我认为这是因为当它从 mongo 库转换Region
使用时to_document
,它会使用 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, Deserialize, Debug)]
pub struct Area {
pub id: Option<String>,
pub name: 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
fieldInsertableArea
属性,我想我也需要一个InsertableRegion
for。
解决方案
显然如果你要求 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, Deserialize, Debug)]
pub struct AreaAPI {
#[serde(flatten)]
pub area: Area,
pub ext_api_id: Option<String>,
}
另一种解决方案可能是使用skip_serializing_none
,但我认为这不是您的用例的最佳解决方案。
推荐阅读
- javascript - 无法使用对象访问读取数组中的属性
- rust - 如何在 Rust 中创建单线程单例?
- python - 无法转换类型的输入 DatetimeIndex
到时间戳 - c++ - 无法推断 Eigen::Matrix 的模板参数
- c++ - C++11中基于类型要求的类模板成员函数
- java - 为 JBoss 应用程序自动设置环境变量
- pandas - 在不删除所有 NaN 的情况下,通过前导 NaN 向左移动行
- java - 在方法中使用 Math.round() 与直接使用
- php - PHP 为 windows 中的 curl 扩展提供了致命错误。curl_init 未定义
- javascript - 处理来自nodejs的大文件数据以将它们插入mongodb