MongoDB实例与关系denormalistion

时间:2013-07-26 04:53:32

标签: mongodb

我玩最好的mongodb文档建模方法

我正在为一所学校建模。

学生有很多科目。

Student{
  subjects:[ {name:'',
              level:'',
              short name:''
             },
             {...},
             {...}]
}

决定对学生进行反规范化并将其嵌入学生的表现中。

极少数情况下需要查询和更新主题。

subjects.all
subject1.short_name = 'something new'

我知道我将不得不遍历每个学生来更新每个科目。

然而,这是回归所有独特科目的最好方法吗?

例如,您可以对student.subjects名称进行独特搜索吗?

或者更好的是拥有另一个

的集合
Subjects{
    name:'',
    level:'',
    short name:''
}

我仍然保留了非规范化的Student.subject。但这仅仅是为了提供所有提供的主题。

更新后会更新此+每个嵌入的Student.subject?

有任何建议/建议吗?

1 个答案:

答案 0 :(得分:0)

  

然而,这是回归所有独特科目的最好方法吗?

这是您的架构的短暂下降。你可以轻松地做出这种事情,以换取你经常做的其他速度优势。

目前唯一真正的方法是使用distinct()命令(http://docs.mongodb.org/manual/reference/method/db.collection.distinct/):

db.students.distinct('subjects.name');

或聚合框架:

db.students.aggregate([
    {$unwind:'$subjects'},
    {$group:{_id:'$subjects.name'}}
])

喜欢这样。

至于架构推荐,如果你打算经常进行这种查询,那么我会将主题分解为一个单独的集合。