如何从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 } }
解决方法
确认MongoDB版本
Schema验证的详细错误信息仅在MongoDB 3.6及以上版本支持,先检查你的服务器版本是否符合要求。修正异常处理逻辑
详细的验证错误信息藏在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; } } } }
- 排查
getWriteErrors()为空的情况
如果遍历getWriteErrors()时没有结果,可能是因为你用了单文档写入操作(比如insertOne)。这种情况下可以改用BulkWrite执行写入,或者确保你的mongodb PHP扩展和库是最新稳定版,避免版本兼容问题。
内容的提问来源于stack exchange,提问作者Shaolin
相关产品推荐
相关产品推荐

