如何确定为什么MongoDB文档无法通过验证?


13

如何确定为什么MongoDB文档插入无法通过验证?我得到的只是一个writeError,上面写着“文档验证失败”,这不是很有帮助。

(这种情况经常发生,我想了解如何正确调试它们,而不是寻求具体示例的帮助。)

Answers:


10

与MongoDB 3.2一样,没有关于文档验证失败原因的反馈:当前,整个验证表达式的评估结果为“真”(“确定”)或“假”(“文档验证失败”)。可以使用validationAction(错误/警告)和validationLevel(严格/中等/关闭)配置选项来调整验证行为,但这不会为验证失败提供任何其他背景信息。

如果您希望获得更详细的反馈,建议的方法是将验证逻辑添加到您的应用程序中,而不是仅依赖于服务器端检查。即使使用服务器端验证,也最好在应用程序业务逻辑中进行许多检查,以最大程度地减少与数据库服务器的往返行程,并向最终用户提供响应更快的反馈。

例如,在将Web应用程序的用户输入(必填字段,字段格式等)提交给您的应用程序或尝试在数据库中插入/更新之前,应先在浏览器中对其进行验证。

但是,确实有必要在多个级别进行验证以确保数据质量,并且某些上下文来诊断验证失败将非常有用。您可以在MongoDB问题跟踪器中观察/投票赞成相关的开放功能请求:SERVER-20547:公开操作未能通过文档验证的原因

有关更多信息,您可能还对文档验证-第1部分:添加文档的适当控制量感兴趣。这突出显示了MongoDB 3.2上文档验证的一些一般利弊,并包括基于validationActionvalidationLevel配置选项的结果参考表。


2
谢谢!猜猜我在这里什么都没错过。实际上,我们确实在应用程序中进行了大部分验证,但是我们将低级检查留给MongoDB验证器,主要是为了确保我们的软件工程师(和我本人)在开发过程中不会产生错误,而不是在生产中发现用户错误。我投票赞成JIRA。干杯!
乔纳森·惠勒

问题在于模式格式是“半标准的”,即具有MongoDB扩展,因此使用标准JSON模式验证器仍然很难找出是什么原因。
汉迪·爱侣湾

1
@HendyIrawan是的,MongoDB数据类型的JSON Schema有一些扩展,因此需要进行额外的客户端验证或转换以进行严格验证。我已经看到了一些类似mongo-schemerNode.js的示例,它基于AJV(另一个JSON模式验证器)
Stennie

1

当然,最初的答案是正确的,在到达数据库之前处理验证绝对是最佳实践,但实际上,如果您需要像现在这样将其删除,可以暂时从Schema中删除验证,然后查看显示的内容在集合中。

如果需要一个字段,但它至少显示丢失,为空或形状不正确,则会缩小搜索范围。如果数据看起来正确,请查看模式中指定的验证。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.