MongoDB嵌入式文档

时间:2011-09-12 22:04:22

标签: java mongodb

在使用SQL后端的JPA中,嵌入式表会自动更新。 NoSQL(MongoDB)中是否有一种机制可以实现相同的目标?
这是我想要实现的一个例子:
表:

  

学生
    学生详情
    @OneToMany
    课程详情(来自其他课程表)

在JPA和SQL中,如果更新“课程详细信息”表,则更改将反映在所有引用它的学生中。

在MongoDB中,不是使用连接,而是将文档嵌入其中。我们如何在MongoDB中解决这个问题?

谢谢, 萨姆

2 个答案:

答案 0 :(得分:2)

简而言之,没有。这也是一个苹果和橘子的问题。 MongoDB是最松散意义上的SQL替代品。他们都是数据库。 JPA是一个ORM层,可以做一些事情,比如保持你的1:N和N:M关系一致。目前没有实现JPA或其附近的MongoDB ORM层。

也就是说,在像mongo这样的NoSQL数据库的上下文中,你的架构是不正确的。您不应该嵌入包含重用内容的文档(在大多数情况下,异常涉及性能优化,在这种情况下,您会牺牲数据复制的标准化以及性能等方面的优势。)

在这种情况下,您需要一个单独的课程详细信息集合,并在学生文档中存储该课程详细信息的_id值数组。这样,您可以单独修改此集合,而无需跟踪课程详细信息文档的突变。

请勿使用DBRefs引用。 DBRefs不是用于对已知类型的文档进行ID引用的适当工具。请改用简单的_id引用。

所以,TL; DR版本:

  • 将课程详细资料文件分开收集
  • 仅在学生的课程详细信息文档中嵌入一个_id数组

示例:

db.students {
    _id: ..,
    name: Willy Wonka,
    courses: [..,..,..]
}

db.courses {
    _id: ..,
    course: "MongoDB for Dummies"
}

答案 1 :(得分:0)

您可以使用reference代替嵌入式文档。然后,只有一份课程数据,所有学生必须按照定义参考相同的信息。