【发布时间】:2013-01-25 06:07:50
【问题描述】:
我了解到您可以将 Mongoose 设为自动 pouplate ObjectId 字段。但是,我在构建查询以填充子文档中的字段时遇到问题。
我的模型:
var QuestionSchema = new Schema({
question_text: String,
type: String,
comment_field: Boolean,
core_question: Boolean,
identifier: String
});
var SurveyQuestionSchema = new Schema({
question_number: Number,
question: {type: Schema.Types.ObjectId, ref: 'Question', required: true} //want this popuplated
});
var SurveySchema = new Schema({
start_date: Date,
end_date: Date,
title: String,
survey_questions: [SurveyQuestionSchema]
});
现在我通过这样做来达到效果:
Survey.findById(req.params.id, function(err, data){
if(err || !data) { return handleError(err, res, data); }
var len = data.survey_questions.length;
var counter = 0;
var data = data.toJSON();
_.each(data.survey_questions, function(sq){
Question.findById(sq.question, function(err, q){
sq.question = q;
if(++counter == len) {
res.send(data);
}
});
});
});
这显然是一种非常容易出错的方式......
【问题讨论】:
-
为此问题找到了 bug thread 和 roadmap。都是当前的。
-
谢谢@numbers1311407!很高兴知道。不过,我开始认为,必须有一种方法可以重组我的架构以使其适用于当前的实现。
-
也许是一个愚蠢的问题(因为除此之外我对应用一无所知),但你真的需要
SurveyQuestion吗? Mongoose 数组的顺序是有保证的,所以你不需要对它们进行排序。在不了解应用程序的情况下查看它,它看起来像Survey可以嵌入Questions。 -
这个想法是稍后在 SurveyQuestion 中可以有一些修饰符字段,例如 required ,也许还有一个属性数组,这些属性可以扩展到问题
-
顺便说一下上下文,这里是对应的backbone models和mongoose models