Mongoose Schema:使用嵌套数组存储将要查询的数据

时间:2016-02-19 13:04:22

标签: node.js mongodb mongoose

我正在使用mongodb和mongoose来存储一组学生的数据。

他们每年参加一次或两次K& A级训练营。 1,我主要想跟踪学生掌握的技能,以及他们达到的日期,以及一些个人会话特定的数据。

这是我的架构:

var location = ["DJ", "MLK"];
var days = ["MoWe", "TuTh"];
var grades = ["K", "First"];
var skills = ["FK", "BC", "BK", "IK", "PS", "SLF", "RBC", "RBK", "RIK", "FS", "BS"];
var achievements = ["Red", "Yellow", "Green"];


var studentSchema = new Schema({
  name: String,
  sessionInfo: [{
    sessionName: String,
    location: {type: String, enum: locations},
    instructor: String,
    class: {school: String, teacher: String},
    grade: {type: String, enum : grades},
    age: {type: Number},
    days: {type: String, enum : days}}],
    skills: [{skill: {type: String, enum: skills}, date: Date}],
    absences: [{date:  Date, reason: String}],
    achievements: [{achievement: {type: String, enum: achievements}}],
    notes: [{instructorName: String, note: String}]
});

因为学生最多会参加3到4次课程,所以我认为将会话信息存储在自己的阵列中是有意义的,而不是试图将每个学生会话存储在其中文献。

我的问题是,如果我要根据获得的技能,年级,学校和地点定期查询学生,这是否会显着影响查询数据库的响应时间。

请注意,会话信息中的所有数组都不会无限制地增长。

1 个答案:

答案 0 :(得分:0)

由于mongodb在RAM中存储索引,如果集合的大小很大,那么在为sessionInfo创建单独的集合的情况下性能会更低,其中每个会话都有自己已编入索引的ObjectId(假设所有会话的总会话数)学生会非常大。)

查询索引的ObjectId通常比查询对象数组中的主键更快。但正如你所说sessionInfo数组不会有超过3到4条记录,最好将sessionInfo保持为一个数组。您还可以在会话对象的特定属性上创建索引。