我正在使用 Node/Mongoose/MongoDB 并尝试构建一个轮询应用程序。一个关键需求是跟踪单个用户对同一民意调查的响应如何随时间变化(他们一遍又一遍地进行同一民意调查)。
我有一个用户模型:
var UserSchema = new Schema({
...
})
我将问题嵌入到我的投票文档中,因为当我请求投票时几乎总是需要这些问题。
var QuestionSchema = new Schema({
text: { type: String, required: true }
})
var PollSchema = new Schema({
name: { type: String, required: true },
questions: [QuestionSchema]
})
module.exports = mongoose.model('Poll', PollSchema);
// Know this is unnecessary, but read the following to see why I'm doing this
module.exports = mongoose.model('Question', QuestionSchema);
这是我的困惑:
我的用户将多次进行同一项民意调查。因此,我正在创建一个“AnswerHistory”,其中包含单个用户对民意调查中单个问题的每个“答案”。
我不明白如何创建从一个文档到另一文档中嵌入文档的引用。例如:
var AnswerSchema = new Schema({
answer: { type: String, required: true },
time: { type: Date }
})
var AnswerHistorySchema = new Schema({
user: { type: Schema.ObjectId, ref: 'User' },
// I know this is wrong, but...
question: { type: Schema.ObjectId, ref: 'Question' },
answers: [AnswerSchema]
})
我在这里缺少什么?
- 我是否需要改为引用民意调查,并跟踪答案历史记录适用于民意调查中的哪个问题?
- 或者这是否意味着我不应该在投票文档中嵌入问题?
- 还有什么我没有想到的吗?
编辑:这是查看问题的更简洁的方式:
var C = new Schema({...});
var B = new Schema({c: [C]});
var A = new Schema({c: { type: ObjectId, ref: 'B.c' });
我宁愿让民意调查的“版本”跟踪用户和答案,而不是历史模式。
每次用户进行新的民意调查时,您都会创建一个 PollByUser 对象。
比方说:
var PollByUserSchema = new Schema({
user: { type: Schema.ObjectId, ref: 'User' },
poll:{ type: Schema.ObjectId, ref: 'Poll' },
taken:{
type:Date,
default:Date.now
}
});
module.exports = mongoose.model('PollByUser', PollByUserSchema);
var AnswerSchema = new Schema({
answer: { type: String, required: true },
time: { type: Date },
question: { type: Schema.ObjectId, ref: 'Question' },
pollByUser: { type: Schema.ObjectId, ref: 'PollByUser' },
})
编辑:
var PollSchema = new Schema({
name: { type: String, required: true },
questions: [{ type: Schema.ObjectId, ref: 'Question' }]
})
我是一名优秀的程序员,十分优秀!