簡體   English   中英

如何使Mongoose的.populate()與嵌入式模式/子文檔一起工作?

[英]How to Make Mongoose's .populate() work with an embedded schema/subdocument?

我了解到,您可以使Mongoose自動將對象ID字段化。 但是,我在構造查詢以填充子文檔中的字段時遇到了麻煩。

我的模特:

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

這顯然是一種非常容易出錯的方式...

正如我在上面的評論中指出的那樣,這是貓鼬團隊目前正在審查的一個問題(尚未實施)。

另外,從局外人的角度看待您的問題,我的第一個想法是更改架構以消除SurveyQuestion ,因為它具有非常相關的db“ join”模型感覺。 貓鼬嵌入的集合具有靜態的排序順序,無需保留位置字段,並且如果您可以處理Survey本身的問題選項,那么它將降低架構的復雜性,因此您無需進行雙重填充。

話雖如此,您可以通過一次查詢所有問題來將查詢減少到2,例​​如:

Survey.findById(req.params.id, function(err, data){
    if(err || !data) { return handleError(err, res, data); }

    var data = data.toJSON();
    var ids = _.pluck(data.survey_questions, 'question');

    Question.find({_id: { $in: ids } }, function(err, questions) {
        _.each(data.survey_questions, function(sq) {
            sq.question = _.find(questions, function(q) { 
                var id = q._id.toString();
                return id == sq.question; 
            });

        });
        res.send(data);
    });
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM