使用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
相关产品推荐
相关产品推荐

