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

如何从PHP的MongoDB BulkWriteException获取验证失败详情?

提取MongoDB Schema验证失败的详细错误信息

我给MongoDB集合的某个属性设置了Schema验证,要求其类型为整数。测试时向该属性传入字符串,触发了MongoDB\Driver\Exception\BulkWriteException异常,提示仅为Document failed validation。根据MongoDB官方文档,应该能获取到验证失败的详细原因(比如description属性),但原代码无法提取这些信息。原测试代码如下:

try {
    doSomething('string');//force validation to failed
} catch (MongoDB\Driver\Exception\BulkWriteException $ex) {
    echo $ex->getMessage();// shows: Document failed validation
    var_dump($ex->getWriteResult()->getServer()->getInfo());// shows server info but not the error info
    foreach ($ex->getWriteResult()->getWriteErrors() as $error) {
        var_dump($error);// it is empty
    }
}

解决方法

  1. 确认MongoDB版本
    Schema验证的详细错误信息仅在MongoDB 3.6及以上版本支持,先检查你的服务器版本是否符合要求。

  2. 修正异常处理逻辑
    详细的验证错误信息藏在WriteError对象的getInfo()返回值里,调整代码如下:

try {
    doSomething('string'); // 触发验证失败
} catch (MongoDB\Driver\Exception\BulkWriteException $ex) {
    echo $ex->getMessage() . PHP_EOL;

    foreach ($ex->getWriteResult()->getWriteErrors() as $error) {
        $errorDetails = $error->getInfo();
        
        if (isset($errorDetails['details']['schemaRulesNotSatisfied'])) {
            foreach ($errorDetails['details']['schemaRulesNotSatisfied'] as $violation) {
                echo "验证失败详情: " . $violation['description'] . PHP_EOL;
            }
        }
    }
}
  1. 排查getWriteErrors()为空的情况
    如果遍历getWriteErrors()时没有结果,可能是因为你用了单文档写入操作(比如insertOne)。这种情况下可以改用BulkWrite执行写入,或者确保你的mongodb PHP扩展和库是最新稳定版,避免版本兼容问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 05:40:41