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 来检索章节,我是否需要将其设为单独的文档集合? mongoosepopulate
非常灵活,因此您可以尝试我的示例并选择对您的情况最有用的示例。
再次感谢 Artem 的快速回复。如果我运行第 2 版,我会得到用于提及 InChapter 的空白数组。并且没有抛出错误。所以它仍然没有填充。 Path keyPoints 是一个数组。所以不确定这条路径 keyPoints.mentionInChapter 是否可以工作?
应该的。有些例子是人们解决相同的任务***.com/questions/19222520/…尝试添加model
选项来填充配置
尝试将模型作为“章节”或模型作为“keyNote”,结果仍然相同。 mongodb 中的数据按照这个要点 - gist.github.com/sham332/20ad1c7b1b460c478700。想知道我是否以错误的方式存储数据?以上是关于Mongoose 从另一个子文档填充子文档,其中两个子文档都是主文档的一部分的主要内容,如果未能解决你的问题,请参考以下文章