我正在使用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次课程,所以我认为将会话信息存储在自己的阵列中是有意义的,而不是试图将每个学生会话存储在其中文献。
我的问题是,如果我要根据获得的技能,年级,学校和地点定期查询学生,这是否会显着影响查询数据库的响应时间。
请注意,会话信息中的所有数组都不会无限制地增长。
答案 0 :(得分:0)
由于mongodb在RAM中存储索引,如果集合的大小很大,那么在为sessionInfo创建单独的集合的情况下性能会更低,其中每个会话都有自己已编入索引的ObjectId(假设所有会话的总会话数)学生会非常大。)
查询索引的ObjectId通常比查询对象数组中的主键更快。但正如你所说sessionInfo数组不会有超过3到4条记录,最好将sessionInfo保持为一个数组。您还可以在会话对象的特定属性上创建索引。