mongoDB中在哪里处理数据库错误?

mongoDB中在哪里处理数据库错误?,mongodb,data-integrity,Mongodb,Data Integrity,当用户在网站上注册时,需要提供唯一的电子邮件。我在模式的email属性上建立了唯一索引,所以如果我尝试将文档保存在数据库中,将返回代码为11000的错误。我的问题是,关于业务层和数据层,我应该只将文档传递到数据库并捕获/检查它返回的错误代码,还是应该检查之前是否存在使用该电子邮件的用户?有人告诉我,在业务层将数据传递到数据库之前,应该检查数据完整性,但我不明白为什么要这样做,因为我相信mongo会更快地引发异常,因为它提供了索引。我在错误代码检查中看到的唯一缺点是错误代码可能会更改(但我可以将它

当用户在网站上注册时,需要提供唯一的电子邮件。我在模式的email属性上建立了唯一索引,所以如果我尝试将文档保存在数据库中,将返回代码为11000的错误。我的问题是,关于业务层和数据层,我应该只将文档传递到数据库并捕获/检查它返回的错误代码,还是应该检查之前是否存在使用该电子邮件的用户?有人告诉我,在业务层将数据传递到数据库之前,应该检查数据完整性,但我不明白为什么要这样做,因为我相信mongo会更快地引发异常,因为它提供了索引。我在错误代码检查中看到的唯一缺点是错误代码可能会更改(但我可以将它们抽象出来),语法可能会更改。

正如@JamesWahlin所说,这是一个多合一或通过添加额外的客户端读取导致潜在竞争条件的混合结果(以及索引检查)之间的区别


这里绝对依赖MongoDB的only insert的响应

实际问题是速度和“先检查后设置”系统的脆弱性。如果在编写电子邮件上键入的文档之前尝试检查电子邮件是否存在,则在检查时间和更正时间之间,有可能满足唯一索引的条件,并且您的写入无论如何都会失败。这是一个经典的比赛条件。此外,执行检查和设置需要2个查询,但执行插入和处理失败只需要1个查询。在我的应用程序中,我成功地让失败发生并对结果作出反应。

我认为尝试插入并处理重复密钥错误是可以的。这样可以节省每次插入时必须支付的读取请求成本。如果您想避免点击数据库进行检查,则必须在业务层缓存现有用户电子邮件地址,这可能可行,也可能不可行,具体取决于用户数量和可用资源。