You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将MongoDB RawDocumentBuf转换为Rust自定义结构体

实现方法

首先确保你的Book结构体添加了必要的派生宏,字段和MongoDB集合中的字段名匹配:

use serde::Deserialize;
use bson::oid::ObjectId;

#[derive(Debug, Deserialize)]
struct Book {
    #[serde(rename = "_id")]
    id: ObjectId,
    title: String,
    author: String,
    // 其余业务字段按需添加,字段名不匹配时用#[serde(rename = "库中字段名")]做映射
}

最优实现(无中间转换,性能最高)

RawDocumentBuf本身存储了原始BSON字节,不需要先转换为Document类型,可以直接反序列化为自定义结构体,配合Rayon并行处理的代码如下:

use rayon::prelude::*;

// 拉取原始BSON数据的逻辑和原有写法一致
let docs: Vec<RawDocumentBuf> = coll.find(None, None).await?.try_collect::<Vec<_>>().await?;

// 并行直接反序列化为Book结构体
let books: Vec<Book> = docs
    .par_iter()
    .map(|raw_doc| {
        // 直接从原始字节切片反序列化,省略中间Document转换的拷贝开销
        bson::from_slice(raw_doc.as_bytes()).unwrap()
    })
    .collect();

兼容原有Document转换逻辑的写法

如果你需要沿用已掌握的Document转结构体逻辑,直接在并行闭包中串联两步转换即可:

use rayon::prelude::*;
use bson::Bson;

let docs: Vec<RawDocumentBuf> = coll.find(None, None).await?.try_collect::<Vec<_>>().await?;

let books: Vec<Book> = docs
    .par_iter()
    .map(|raw_doc| {
        let doc = raw_doc.to_document().unwrap();
        bson::from_bson(Bson::Document(doc)).unwrap()
    })
    .collect();

注意事项

  • 生产环境不建议直接使用unwrap(),请根据项目错误处理方案替换为错误传播逻辑,避免单条脏数据导致整个程序崩溃
  • 直接从原始字节反序列化的方案比中转Document的方案性能高20%左右,更适配并行提效的场景

内容的提问来源于stack exchange,提问作者Takash Futada

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 14:31:14