使用Spring-Data和mongodb,自然与人工ID?

时间:2012-09-21 03:45:40

标签: mongodb primary-key spring-data

我正在使用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();   

1 个答案:

答案 0 :(得分:0)

将属性组合用作主键肯定是合理的。但是,将它们放在带有两个字段(uniqueStudentName和yyyymmdd)的子文档中,而不是将它们连接在一起,而不是连接它们。

看一下这个涉及使用复合主键的问题:

MongoDB Composite Key