2015-08-08 53 views
2

我在这里遇到了挑战,我试图从另一个子文档中填充同一集合中的子文档。这是可能的吗?下面是我的示例模式Mongoose从另一个子文档填充子文档,其中两个子文档都是主文档的一部分

var chapter = new Schema({ 
    title:String, 
    startPage:Number, 
    endPage:Number 
}); 


var keyPoint = new Schema({ 
    text:String, 
    mentionInChapter:[{ 
     type: Schema.ObjectId, 
     ref: 'chapter'}] 
}); 


var Book = new Schema({ 
    title:String, 
    author:String, 
    chapters:[chapter], 
    keyPoints:[keypoint] 
}); 

我在下面试过,它没有填充keyPoints数组中的chapterId。

Book.findById(ID).populate( '章')EXEC(函数(ERR,DOC){ 如果(ERR) 的console.log(DOC);! })。

有没有一种方法可以实现这一点,以便我检索的Book文档包含所有的细节?

回答

0

你可以尝试使用Model.populate方法类似如下:

var chapter = new Schema({ 
    title:String, 
    startPage:Number, 
    endPage:Number 
}); 

var keyPoint = new Schema({ 
    text:String, 
    mentionInChapter:[{type: Schema.ObjectId, ref: 'chapter'}] 
}); 

var Book = new Schema({ 
    title:String, 
    author:String, 
    chapters:[chapter], 
    keyPoints:[keyPoint] 
}); 

Book.findById(id) 
    .lean() 
    .populate('chapters keyPoints') 
    .exec(function (err, docs) { 
     if (err) throw err; 

     Book.populate(docs, {path: 'keyPoints.mentionInChapter'}, function (err, book) { 
     if (err) throw err; 

     console.log(book); 
     }); 
    }); 

UPDATE:版本2:

var chapter = new Schema({ 
    title:String, 
    startPage:Number, 
    endPage:Number 
}); 

var keyPoint = new Schema({ 
    text:String, 
    mentionInChapter:[{type: Schema.ObjectId, ref: 'chapter'}] 
}); 

var Book = new Schema({ 
    title:String, 
    author:String, 
    chapters:[chapter], 
    keyPoints:[keyPoint] 
}); 

Book.findById(id).exec(function (err, doc) { 
    if (err) throw err; 

    Book.populate(doc, {path: 'keyPoints.mentionInChapter'}, function (err, book) { 
     if (err) throw err; 

     console.log(book); 
    }); 
}); 
+0

谢谢阿尔乔姆。在上述解决方案中,您将章节和关键点作为单独的文档,而不是嵌入的文档。关键点会让我感觉到,因为这会增加规模。但是想知道如果我总是用Book来检索章节,我是否需要使它成为一个单独的文档集合? – Sham332

+0

我已经更新了我的答案。尝试'Version 2' –

+0

mongoose'populate'非常灵活,所以你可以尝试我的例子,并选择一个对你的情况最有用的。 –