2014-10-27 138 views
1

我正在使用Node/Mongoose/MongoDB并试图构建一个轮询应用程序。一个关键的需求是跟踪单个用户对同一轮询的响应如何随着时间的推移而变化(他们会一遍又一遍地进行相同的轮询)。Mongoose JS:在一个文档中创建一个引用到另一个文档中的嵌入文档

我有一个用户模式:

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); 

这里是我的困惑:

我的用户将在同一调查中多次服用。因此,我创建了一个“答案历史”,其中包含每个用户对投票中单个问题的“答复”。

我不明白如何做的是创建从一个文档到另一个文档中的嵌入式文档的参考。例如:

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] 
}) 

我在这里错过了什么?

  • 是否需要引用投票调查,并记录投票内的AnswerHistory应用于哪个问题?
  • 或者这是否意味着我不应该在投票文件中嵌入问题?
  • 其他我还没想过的东西?

编辑:这是看问题更简洁的方式:

var C = new Schema({...}); 
var B = new Schema({c: [C]}); 
var A = new Schema({c: { type: ObjectId, ref: 'B.c' }); 

回答

0

而是具有历史模式,我宁愿有投票的“版本”跟踪用户和答案。

每次用户进行新的轮询时,都会创建一个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' }] 
}) 
+0

感谢您的建议。我想我明白你对整体策略的意思,但我仍然有点困惑。我的理解是,我不能在AnswerSchema中使用ref:“Question”,因为问题是Poll中嵌入的文档。这不正确吗? – 2014-10-27 23:14:29

+0

我得到了你,很好,我知道你不能,但你可以改变你的投票模式,只有问题ID的参考 – 2014-10-27 23:32:30

+0

嗯,那是我想要避免的一件事。如果没有人建议避免这种情况,我会接受答案。谢谢! – 2014-10-28 11:27:51

相关问题