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

使用Rust向MongoDB Atlas插入BSON文档遇Borrow trait绑定错误

问题解决方案

1. 修复Bson未实现Borrow<Document>的错误

to_bson(&person)返回的是Bson类型,而Collection<Document>的insert_one方法要求传入能被借用为Document的参数。由于你的Person结构体序列化后本质是BSON文档,需要显式将Bson转换为Document:

转换方式1:匹配BSON变体

let bson_doc = match to_bson(&person).unwrap() {
    Bson::Document(doc) => doc,
    _ => panic!("Person序列化结果不是BSON文档"),
};

转换方式2:直接提取文档(需确保序列化结果必为文档)

let bson_doc = to_bson(&person).unwrap().as_document().unwrap().clone();

2. 修复第二次插入同一变量失败的问题

insert_one会获取传入参数的所有权,第一次调用后bson_doc已被移动,无法再次使用。解决思路有两种:

  • 提前克隆一份文档供第二次插入
  • 重新生成Document(比如再次序列化Person实例)

示例代码(克隆方式)

let db = super::setup().await.unwrap();
let users_collection = db.collection::<Document>("users");

#[derive(Serialize, Deserialize)]
struct Person {
    name: String,
    age: i32,
}

let person = Person {
    name: "Alice".to_string(),
    age: 25,
};

// 转换为Document并克隆一份
let bson_doc = to_bson(&person).unwrap().as_document().unwrap().clone();
let bson_doc_clone = bson_doc.clone();

// 第一次插入
users_collection.insert_one(bson_doc, None).await.unwrap();

println!("{}", bson_doc_clone);

// 第二次插入克隆后的文档
let insert_result = users_collection.insert_one(bson_doc_clone, None).await.unwrap();
println!("New document ID: {}", insert_result.inserted_id);

更优雅的简化写法

MongoDB Rust驱动支持直接序列化结构体,无需手动处理BSON转换。可以将Collection的泛型设为Person,直接插入结构体引用:

let users_collection = db.collection::<Person>("users");

// 直接插入Person实例,驱动自动完成序列化
users_collection.insert_one(&person, None).await.unwrap();
users_collection.insert_one(&person, None).await.unwrap(); // 传引用不会转移所有权,可重复插入

内容的提问来源于stack exchange,提问作者Mike Chan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 03:35:03