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

Rust中MongoDB重复键(11000)错误的优化处理方案咨询

优化MongoDB重复键错误处理的几种方式

你这段嵌套三层match的代码确实冗余,下面是几种更简洁的优化思路:

1. 用if let链式匹配减少嵌套

直接把多层模式匹配合并到一个if let中,砍掉不必要的嵌套层级:

let res = collection.insert_one(entry).await;
match res {
    Ok(_) => Ok(()),
    Err(e) => {
        if let ErrorKind::Write(WriteFailure::WriteError(we)) = *e.kind {
            if we.code == 11000 {
                Ok(())
            } else {
                Err("其他写入失败".into())
            }
        } else {
            Err("其他错误".into())
        }
    }
}

2. 封装工具函数复用判断逻辑

如果多处需要判断重复键错误,把判断逻辑抽成单独函数,代码更清晰且可复用:

use mongodb::{error::{Error, ErrorKind, WriteFailure}};

fn is_duplicate_key_error(e: &Error) -> bool {
    matches!(
        *e.kind,
        ErrorKind::Write(WriteFailure::WriteError(we)) if we.code == 11000
    )
}

// 使用时的代码
let res = collection.insert_one(entry).await;
match res {
    Ok(_) => Ok(()),
    Err(e) => {
        if is_duplicate_key_error(&e) {
            Ok(())
        } else if matches!(*e.kind, ErrorKind::Write(_)) {
            Err("其他写入失败".into())
        } else {
            Err("其他错误".into())
        }
    }
}

3. 用Result链式调用简化代码

利用Result的or_else方法,把错误处理逻辑链式写在一起,代码更紧凑:

collection.insert_one(entry).await.or_else(|e| {
    match *e.kind {
        ErrorKind::Write(WriteFailure::WriteError(we)) if we.code == 11000 => Ok(()),
        ErrorKind::Write(_) => Err("其他写入失败".into()),
        _ => Err("其他错误".into()),
    }
})

如果不需要区分“其他写入失败”和“其他错误”,还能进一步简化:

collection.insert_one(entry).await.or_else(|e| {
    if matches!(
        *e.kind,
        ErrorKind::Write(WriteFailure::WriteError(we)) if we.code == 11000
    ) {
        Ok(())
    } else {
        Err(e.into()) // 或者返回自定义错误类型
    }
})

内容的提问来源于stack exchange,提问作者Cutty Shark

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 17:10:05