我正在使用Spring-data将pojos映射到mongo json文档。
mongo对象标识reference说“如果您的文档具有不可变的自然主键,我们建议您在_id中使用它而不是自动生成的ID。”我的问题是,如果我的文档有一个自然的主键,但它是对象属性的某种组合,我应该将它们组合起来创建自然的主键吗?
假设这两个值都不会改变,并且当连接在一起时,结果保证是唯一的。请注意,无论您为id声明什么类型,Spring都会将其转换为ObjectId(除非它们没有该类型的转换器,然后将它们转换为String)。
以下是一个例子:
@Document
public Class HomeworkAssignment {
@Id
private String id;
private final String yyyymmdd;
private final String uniqueStudentName;
private double homeworkGrade;
public HomeworkAssignment(String yyyymmdd, String uniqueStudentName) {
this.yyyymmdd = yyyymmdd;
this.uniqueStudentName = uniqueStudentName;
// can either set the 'id' here, or let Spring give me an artificial one.
}
// setter provided for the homeworkGrade
}
每位学生每天保证不超过一份家庭作业。 yyyymmdd和uniqueStudentName都是作为字符串给我的。
例如,“20120601bobsmith”在2012年6月1日唯一标识Bob Smith的作业。(如果有多个Bob Smith,它已经在我给出的uniqueName中处理)。
假设我想遵循mongo参考建议并使用自然主键(如果有)。有一个,但它是两个领域的组合。这是一个我应该像这样结合起来的情况吗?
this.id = yyyymmdd + uniqueStudentName.toLowerCase();
答案 0 :(得分:0)
将属性组合用作主键肯定是合理的。但是,将它们放在带有两个字段(uniqueStudentName和yyyymmdd)的子文档中,而不是将它们连接在一起,而不是连接它们。
看一下这个涉及使用复合主键的问题: