Mongoose JS:在一个文档中创建一个引用到另一个文档中的嵌入文档

时间:2014-10-27 15:21:42

标签: node.js mongodb mongoose

我正在使用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]
})

我在这里缺少什么?

  • 我是否需要引用民意调查,并在民意调查中跟踪AnswerHistory应用的问题?
  • 或者这是否意味着我不应该在民意调查文件中嵌入问题?
  • 我还没想到别的什么?

编辑:这是一个更简洁的方法来查看问题:

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

1 个答案:

答案 0 :(得分: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' }]
})