2017-05-13 2 views
1

Angenommen, ich habe folgende Schemata:Bestell zwei Referenzanordnungen zusammen

var QuizSchema = new mongoose.Schema({ 
    name: { type: String, required: true }, 
    questions: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Question' }], 
    questionGroups: [{ type: mongoose.Schema.Types.ObjectId, ref: 'QuestionGroup' }] 
}); 

var QuestionSchema = new mongoose.Schema({ 
    number: { type: String, required: true }, // e.g. 1, a, i, anything 
    question: { type: String, required: true }, 
    type: { type: String, enum: ['multiple choice', 'multiple select', 'short answer'] }, 
    choices: [String], 
    answers: [String] 
}); 

var QuestionGroupSchema = new mongoose.Schema({ 
    number: { type: String, required: true }, // e.g. 1, a, i, anything 
    prompt: { type: String }, 
    questions: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Question' }] 
}); 

Ich versuche, einen Weg entwerfen, die mir erlaubt, Fragen und Fragengruppen zusammen zu bestellen.

Ich dachte, vielleicht ein neues Feld der Zugabe order

var QuizSchema = new mongoose.Schema({ 
    // ... 
    order: [ 
     { 
      type: { type: String, enum: ['Question', 'QuestionGroup'] }, 
      id: mongoose.Schema.Types.ObjectId // reference 
     } 
    ] 
}); 

, so dass in der Datenbank, das Feld etwas wie

[ 
    { type: 'Question', id: ObjectId('57867a34567g67790') }, 
    { type: 'Question', id: ObjectId('57867a34567g67765') }, 
    { type: 'QuestionGroup', id: ObjectId('69864b64765y45645') }, 
    { type: 'Question', id: ObjectId('57867a34567g67770') }, 
    { type: 'QuestionGroup', id: ObjectId('69864b64767y45647') } 
] 

Dies kann bedeuten, enthalten würde, dass ich brauchen würde, um " füllen Sie "die geordnete Liste von Fragen und Fragengruppen als

quiz.populate('questions questionGroups').exec(function (err, quiz) { 
    // sort questions and groups by the order 
    quiz.order = quiz.order.map(function (o) { 
     if (o.type === 'QuestionGroup') { 
      return quiz.questionGroups.id(o.id); 
     } 
     return quiz.questions.id(o.id); 
    }); 
}); 

Also meine Frage: Gibt es einen besseren Weg dies zu gestalten?

+0

Sie wollen Fragen und Fragen in einem Array nacheinander, wenn Sie ein Quiz finden? –

+0

@TalhaAwan Das ist in etwa richtig. Ihre Reihenfolge kann sich jedoch ändern. – Mikey

Antwort

2

Virtuals kann hier nützlich sein; ohne persistierende order Feld in db und Berechnungen auf Client jedes Mal tun:

var QuizSchema = new mongoose.Schema({ 
    name: { type: String, required: true }, 
    questions: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Question' }], 
    questionGroups: [{ type: mongoose.Schema.Types.ObjectId, ref: 'QuestionGroup' }] 
}, 
{ 
    toObject: { 
     virtuals: true 
    }, 
    toJSON: { 
     virtuals: true 
    } 
} 
); 

QuizSchema 
.virtual('order') 
.get(function() { 
    return this.questions.concat(this.questionGroups); //questions followed by questionGroups 
}); 

Sortieren auf createdAt ist natürlich optional, aber für die Sie benötigen, um dieses Feld in Frage und QuestionGroup haben: Im Wesentlichen

Quiz.find({}, function (err, quiz) { 
    //... 
}) 
.populate({path : 'questions', options: {sort: { 'createdAt': 1 }}}) 
.populate({path : 'questionGroups', options: {sort: { 'createdAt': 1 }}});