在我的Spring MVC应用程序中,我有以下Mongo实体:
@Document(collection = "users")
public class UserMongoEntity {
@Id
private String id;
@NotBlank
@Email
@Indexed(unique = true, sparse = true)
private String email;
private String firstName;
以及包含User作为字段的Submission实体:
@Document(collection = "submissions")
public class SubmissionMongoEntity {
@Id
private String id;
private Instant timestamp;
@Valid
private UserMongoEntity user;
当我发出插入新用户的请求时,如果具有相同电子邮件的用户已按预期存在,则会收到错误消息。但是,当我向同一个用户插入两次提交时,我得到一个例外,因为它违反了索引的唯一性:duplicate key error collection: user.email dup key
。
我可以删除@Indexed
,但我相信有更好的方法。
据我所知,没有办法“禁用”嵌套文档的唯一性。正如在这个 question mongo索引中所回答的那样,主要目的是加速某些查询,而不是数据验证。
如果你仍然想要保持一个独特的工作,我可以想到利用mongo的unique compound index and missing values 。为电子邮件创建唯一的复合索引+为用户创建空字段。插入一个提交集,即用户空字段是唯一的(时间哈希或唯一提交ID),从而创建一个不会发生冲突的唯一复合索引。