Rust从MongoDB反序列化含数组对象时触发类型不匹配错误
解决Rust MongoDB反序列化数组时的类型不匹配错误
错误原因
你遇到的invalid type: map, expected a string错误,核心是自定义结构体的数组元素类型和MongoDB文档中的实际结构不匹配:MongoDB数组里的每个元素是包含两个字符串的对象(BSON map),但你的结构体里把数组元素定义成了String类型,反序列化时自然会把对象当成字符串解析,触发类型错误。
正确结构体定义
假设你的MongoDB文档结构如下:
{ "_id": "xxx", "owner": "xxx", "notes": [ { "id": "note1", "content": "内容1" }, { "id": "note2", "content": "内容2" } ] }
对应的Rust结构体要这样定义(需引入serde和bson依赖):
use serde::{Deserialize, Serialize}; use bson::oid::ObjectId; // 数组中的单个对象结构体 #[derive(Debug, Deserialize, Serialize)] struct NoteItem { id: String, content: String, // 替换为你实际的字段名 } // 顶层文档对应的结构体 #[derive(Debug, Deserialize, Serialize)] struct NoteIndex { #[serde(rename = "_id")] id: ObjectId, owner: String, notes: Vec<NoteItem>, // 注意这里是Vec<自定义结构体>,而非Vec<String> }
修正查询后的反序列化逻辑
你之前的代码多了一步JSON转换,容易引发兼容问题。正确做法是直接用bson::from_document把查询到的Document反序列化成自定义结构体:
let index_doc = notes .find_one(bson::doc! {"owner": auth::get_user(&req).await?.id}, None) .await? .unwrap(); // 直接将Document反序列化为自定义结构体 let index: NoteIndex = bson::from_document(index_doc)?; Ok(Body::from_json(&index)?.into())
关键注意点
- 确保结构体字段名和MongoDB文档字段名完全一致,或用
#[serde(rename = "字段名")]做映射(比如_id对应Rust里的id)。 - 数组类型必须是
Vec<自定义对象结构体>,不能是Vec<String>或其他不匹配类型。 - 确认
Cargo.toml中已包含正确依赖:serde(带derive特性)、bson、mongodb。
内容的提问来源于stack exchange,提问作者hellyesdoge
相关产品推荐
相关产品推荐

