【问题标题】:Mongoose populating subdocument from another subdocument where both subdocuments are part of main documentMongoose 从另一个子文档填充子文档,其中两个子文档都是主文档的一部分
【发布时间】:2015-10-31 23:12:41
【问题描述】:

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

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('chapter').exec(function(err,doc){ 如果(!错误) 控制台日志(文档); });

有没有办法实现这一点,以便我检索的 Book 文档填充所有详细信息?

【问题讨论】:

    标签: mongoose


    【解决方案1】:

    您可以尝试使用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);
          });
       });
    

    更新:第 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);
       });
    });
    

    【讨论】:

    • 谢谢阿特姆。在上述解决方案中,您将章节和关键点作为单独的文档而不是嵌入式文档。关键点会让我觉得这会增加尺寸。但是想知道我是否要始终使用 Book 来检索章节,我是否需要将其设为单独的文档集合?
    • mongoose populate 非常灵活,因此您可以尝试我的示例并选择对您的情况最有用的示例。
    • 再次感谢 Artem 的快速回复。如果我运行第 2 版,我会得到用于提及 InChapter 的空白数组。并且没有抛出错误。所以它仍然没有填充。 Path keyPoints 是一个数组。所以不确定这条路径 keyPoints.mentionInChapter 是否可以工作?
    • 应该的。有些例子是人们解决相同的任务stackoverflow.com/questions/19222520/…尝试添加model选项来填充配置
    • 尝试将模型作为“章节”或模型作为“keyNote”,结果仍然相同。 mongodb 中的数据按照这个要点 - gist.github.com/sham332/20ad1c7b1b460c478700。想知道我是否以错误的方式存储数据?
    猜你喜欢
    • 1970-01-01
    • 2016-12-14
    • 2014-08-16
    • 2016-04-13
    • 2017-01-27
    • 1970-01-01
    • 2017-06-13
    • 1970-01-01
    • 2015-08-19
    相关资源
    最近更新 更多