Mongoose 从另一个子文档填充子文档,其中两个子文档都是主文档的一部分

Posted

技术标签:

【中文标题】Mongoose 从另一个子文档填充子文档,其中两个子文档都是主文档的一部分【英文标题】:Mongoose populating subdocument from another subdocument where both subdocuments are part of main document 【发布时间】: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 文档填充所有详细信息?

【问题讨论】:

【参考方案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 是否可以工作? 应该的。有些例子是人们解决相同的任务***.com/questions/19222520/…尝试添加model选项来填充配置 尝试将模型作为“章节”或模型作为“keyNote”,结果仍然相同。 mongodb 中的数据按照这个要点 - gist.github.com/sham332/20ad1c7b1b460c478700。想知道我是否以错误的方式存储数据?

以上是关于Mongoose 从另一个子文档填充子文档,其中两个子文档都是主文档的一部分的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose 填充子子文档

Mongoose 填充子文档数组

发送多个子文档时,Mongoose 验证失败

发送多个子文档时,Mongoose 验证失败

创建后如何在 mongoose 中填充子文档?

Mongoose - 无法在路径 notification.from 上使用排序填充,因为它是文档数组的子属性