1

我正在使用 Spring-data 将 pojos 映射到 mongo json 文档。

mongo Object Id参考说“如果您的文档具有不可变的自然主键,我们建议您在 _id 中使用它而不是自动生成的 ids。” 我的问题是,如果我的文档有一个自然主键,但它是对象属性的某种组合,我应该将它们组合起来创建自然主键吗?

假设这两个值都不能改变,并且当连接在一起时,结果保证是唯一的。请注意,无论您为 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”唯一标识了 Bob Smith 2012 年 6 月 1 日的作业。(如果有多个 Bob Smith,则已经在我给定的 uniqueName 中处理了)。

假设我想遵循 mongo 参考建议并使用自然主键(如果有)。有一个,但它是 2 个字段的组合。这是我应该像这样组合它们的情况吗?

this.id = yyyymmdd + uniqueStudentName.toLowerCase();   
4

1 回答 1

0

使用属性组合作为主键当然是合理的。然而,与其将它们连接起来,将它们放入具有两个字段(uniqueStudentName 和 yyyymmdd)的子文档中可能更符合逻辑,该字段用作 _id。

看看这个问题,它涉及使用复合主键:

MongoDB 组合键

于 2012-09-21T17:49:52.330 回答