|
|
1
1
在MongoDB中,唯一索引确保字段中的特定值不会出现在多个文档中。会的 不 确保单个文档中的数组中的值是唯一的。这是可以解释的 here 在MongoDB手册中讨论了唯一的多键索引。 因此,唯一索引将无法满足您的要求。它将防止单独的文档包含重复的组合,但仍允许单个文档在一个数组中包含重复的值。 最好的选择是更改数据模型,以便将technologyEmployeeRef对象数组拆分为单独的文档。将其拆分为单独的文档将允许您使用唯一索引来强制执行唯一性。 此数据模型更改应采取的具体实现将取决于您的访问模式(这超出了本问题的范围)。 这样做的一种方法是创建一个TechnologyEmployee集合,其中包含当前存在于technologyEmployeeRef数组中的所有字段。此外,这项技术Employee collection将有一个字段,例如电子邮件,允许您将其与Employee collection中的文档相关联。 员工文件样本
员工技术文件样本
员工技术集合中的索引
这种方法的缺点是,需要从两个集合中读取所有数据。如果您很少需要同时从两个集合中检索数据,那么这个缺点可能不是什么大问题。如果您确实需要所有数据,可以通过使用索引来加快速度。有了这些指标,可以通过使用 covered queries . 另一个选择是对数据进行非规范化。您可以通过复制需要与技术数据同时访问的员工数据来实现这一点。 样本文件
在里面 this MongoDB blog post 他们说
或者正如您已经提到的,让数据模型保持原样并在应用程序端执行唯一性检查可能是有意义的。这可能会给你带来最好的阅读性能,但也有一些缺点。首先,它会减慢写操作,因为应用程序需要运行一些检查才能更新数据库。 这可能不太可能,但也有一种可能,你最终可能会得到重复的。如果有两个背对背的请求将同一EmployeeTechnology对象插入数组,那么第二个请求的验证可能会在第一个请求写入数据库之前完成(并通过)。我在自己开发的应用程序中也看到过类似的情况。即使应用程序正在检查唯一性,如果用户双击提交按钮,数据库中也会出现重复条目。在这种情况下,在第一次点击时禁用该按钮可显著降低风险。这一小风险可能是可以容忍的,这取决于您的要求和重复条目的影响。 哪种方法最有意义很大程度上取决于您的访问模式和需求。希望这有帮助。 |