当用户在网站上注册时,需要提供唯一的电子邮件。我已经在schema的email属性上创建了唯一索引,因此如果我尝试将文档保存在数据库中,将返回代码为11000的错误。我的问题是,对于业务层和数据层,我应该将文档传递给数据库并捕获/检查它返回的错误代码,还是应该检查以前存在该电子邮件的用户?我被告知在业务层将数据完整性传递给数据库之前应该检查数据完整性,但是我不知道为什么我应该这样做,因为我相信mongo会更快地提高异常本身,因为它提供了该索引。我在错误代码检查中看到的唯一缺点是错误代码可能会更改(但我可以抽象它们)并且语法可能会更改。
答案 0 :(得分:1)
正如@JamesWahlin所说的那样,通过添加额外的客户端读取,这是一体中的这个或者从潜在的竞争条件中导致混合结果(以及索引检查)之间的区别。
绝对只依赖MongoDB中插入的响应。
答案 1 :(得分:1)
“check-then-set”系统存在速度和脆弱性的实际问题。如果您在编写通过电子邮件键入的文档之前尝试检查是否存在电子邮件,则有可能在您检查的时间和您正确的时间之间满足唯一索引的条件,并且无论如何您的写入都会失败。这是一个经典的比赛条件。此外,它需要2个查询来进行check-then-set,但只有1个查询来执行插入并处理失败。在我的应用程序中,我只是让失败发生并对结果作出反应而取得了成功。