You need to enable JavaScript to run this app. Rust 使用 MongoDB find_one_and_update 实现 upsert 自增 id 报 E0277 错误如何解决
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.24 09:24:03