Rust 使用 MongoDB find_one_and_update 实现 upsert 自增 id 报 E0277 错误如何解决
报错核心原因
参数类型不匹配。
mongodb 驱动的 find_one_and_update 方法第三个入参,要求传入可转换为 Option<FindOneAndUpdateOptions> 的类型,不接受通过 doc! 宏构建的普通 BSON 文档。
报错核心提示:
the trait bound std::option::Option<FindOneAndUpdateOptions>: From<bson::Document> is not satisfied
编译器已明确说明:不存在从bson::Document到Option<FindOneAndUpdateOptions>的转换实现,直接传入拼接了upsert配置的文档,必然触发trait约束不满足的编译错误。
修复操作
- 删掉原先用
doc!构建的option变量,不要用原生BSON文档传方法配置项 - 引入驱动提供的结构化选项类型
mongodb::options::FindOneAndUpdateOptions - 通过该类型的构建器设置需要的
upsert: true配置 - 将构建完成的选项对象用
Some()包装后传入方法的第三个参数位置
修正后的可运行代码
// 引入对应选项类型,若已在当前作用域可跳过 use mongodb::options::FindOneAndUpdateOptions; let mongo_collection = conecction_bd::my_bd_collection("AutoCode").await?; let filter = doc! { "collection": "Student" }; let update = doc! { "$inc": { "id": 1 } }; // 结构化生成更新配置 let update_options = FindOneAndUpdateOptions::builder() .upsert(true) .build(); let document = mongo_collection .find_one_and_update(filter, update, Some(update_options)) .await; /* 此处后续为更新逻辑代码 */
补充提示
- 无自定义配置需求时,第三个参数直接传
None即可,不需要拼接空BSON文档 - 原代码中
mongo_colecction存在拼写错误,可修正为mongo_collection避免后续拼写类的编译警告
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

