2016-11-24 59 views
0

我的任务是使用mongoose修改现有的(大型)node.js网页。是隐含的,有多少层次可以去?

架构具有Question如下可链接到的Answer数组:

var QuestionSchema = mongoose.Schema({ 
    text: { type: String }, 
    ... 
    answers: [{type: mongoose.Schema.Types.ObjectId, ref: 'Answer'}], 
    ... 
}); 

var AnswerSchema = mongoose.Schema({ 
    text: { type: String }, 
    .... 
    question: { 
     type: mongoose.Schema.ObjectId, 
     ref: Question 
    }, 
... 
});  
var Question = mongoose.model('Story', QuestionSchema); 
var Answer = mongoose.model('Answer', AnswerSchema); 

我无法找到populate方法的任何实例中的代码被使用,但一个Question文档的查询总是返回整个answer对象的数组,而不仅仅是对象ID。这是需要的。

我现在必须将reaction对象的数组添加到answer。我用下面的:

var Answer = mongoose.model('Answer', AnswerSchema); 
var ReactionSchema = mongoose.Schema({ 
    text: { type: String }, 
    .... 
    answer: { 
     type: mongoose.Schema.ObjectId, 
     ref: Answer, 
     //required: true 
    }, 
    ... 
}); 

我加入下列至Answer模式:

reactions: [{type: mongoose.Schema.Types.ObjectId, ref: 'Reaction'}] 
//where var Reaction = mongoose.model('Reaction', ReactionSchema); 

我能救reaction对象,当我检查的answer数据库的内容,该reaction对象在question中与answer对象的类型和形式相同。

然而,返回question文档时,的answer.reaction每个元素包含只是reaction,而不是完整reaction对象的对象ID。我省略了什么或者如何根据ref类型使查询执行连接?

mongodb版本是3.2.9,猫鼬是4.0.4。

回答

0

如何查询问题?这是你如何解决嵌套引用:

Question.findById(id).populate({ 
    path: 'answer', 
    model: 'Answer', 
    populate: { 
    path: 'reaction', 
    model: 'Reaction' 
    } 
}).exec(function(err, data){}); 

这里是链接到猫鼬文档:Mongoose Docs Deep Populate

+0

感谢。你的回答给了我解决问题的线索。我的mongo版本根本没有填充方法。我花了更多的时间挖掘现有的代码,最终找到了从'question.answers'中存储的对象id手动检索'answer'对象的代码,然后将它们添加到返回的问题文档中。 –