【发布时间】:2020-09-08 22:26:57
【问题描述】:
我正在处理Spring Boot v2.1.3.RELEASE & Spring Data Mongo。在此示例中,我想对电子邮件和部门名称应用唯一性。 email 和 deptName 的组合必须是唯一的,并且由于它在每个数组对象中重复,是否有任何方法可以将电子邮件发送出去?
我在下面尝试过,但它不起作用!
@CompoundIndexes({
@CompoundIndex(name = "email_deptName_idx", def = "{'email' : 1, 'technologyEmployeeRef.technologyCd' : 1}")
})
样本数据
{
"_id" : ObjectId("5ec507c72d8c2136245d35ce"),
....
....
"firstName" : "John",
"lastName" : "Doe",
"email" : "john.doe@gmail.com",
.....
.....
.....
"technologyEmployeeRef" : [
{
"technologyCd" : "john.doe@gmail.com",
"technologyName" : "Advisory",
....
.....
"Status" : "A"
},
{
"technologyCd" : "john.doe@gmail.com",
"technologyName" : "Tax",
.....
.....
"Status" : "A"
}
],
"phoneCodes" : [
"+352"
],
....
....
}
Technology.java
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Document
public class Technology {
@Indexed(name = "technologyCd", unique = true, sparse = true)
private String technologyCd;
@Indexed(name = "technologyName", unique = true, sparse = true)
private String technologyName;
private String status;
}
EmployeeTechnologyRef.java
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class EmployeeTechnologyRef {
private String technologyCd;
private String primaryTechnology;
private String status;
}
Employee.java
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Document
@CompoundIndexes({
@CompoundIndex(name="emp_tech_indx", def = "{'employeeTechnologyRefs.primaryTechnology' : 1, 'employeeTechnologyRefs.technologyCd' : 1}" ,unique = true, sparse = true)
})
public class Employee {
private String firstName;
private String lastName;
private String email;
private List<EmployeeTechnologyRef> employeeTechnologyRefs;
}
我使用了下面的代码,但它没有给我任何重复的错误。我们该怎么做呢?
Technology java8 = Technology.builder().technologyCd("Java").technologyName("Java8").status("A").build();
Technology spring = Technology.builder().technologyCd("Spring").technologyName("Spring Boot2").status("A").build();
List<Technology> technologies = new ArrayList<>();
technologies.add(java8);
technologies.add(spring);
technologyRepository.saveAll(technologies);
EmployeeTechnologyRef t1 = EmployeeTechnologyRef.builder().technologyCd("Java").primaryTechnology("Y")
.status("A")
.build();
EmployeeTechnologyRef t2 = EmployeeTechnologyRef.builder().technologyCd("Spring").primaryTechnology("Y")
.status("A")
.build();
List<EmployeeTechnologyRef> employeeTechnologyRefs = new ArrayList<>();
employeeTechnologyRefs.add(t1);
employeeTechnologyRefs.add(t2);
employeeTechnologyRefs.add(t1);
Employee employee = Employee.builder().firstName("John").lastName("Kerr").email("john.kerr@gmail.com")
.employeeTechnologyRefs(employeeTechnologyRefs).build();
employeeRepository.save(employee);
【问题讨论】:
-
有一些关于嵌入文档中字段唯一索引的有用信息:How to set unique constraint for field in document nested in array?
-
我已经浏览过了,许多其他类似的链接并不能解决我的问题
-
@prasad_ - 您能否在此处提供有关此查询的明确答案?因为这不能解决我的目的
-
您的问题可以进行一些编辑。目前还不清楚你在问什么。 1)第一部分与第二部分不匹配。首先,您询问的是电子邮件和部门名称,然后您突然询问了 primaryTechnology 和 technologyCd。如果问题涉及一致的数据,问题会更清楚。 2) 你所说的“以任何方式发送电子邮件”是什么意思?您是否在询问如何通过一些清理查询从现有数据中删除该字段?您是否担心如果将其从数组中删除,可能无法在 2 个字段的组合中强制执行唯一性?
-
@jcarter - 我道歉了。我已经更正了所有细节
标签: mongodb spring-data-mongodb