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

Mongoose从另一个子文档填充子文档,其中两个子文档都是主文档的一部分,mongoose,Mongoose,我在这里遇到了一个挑战,我试图从同一集合中的另一个子文档填充一个子文档。这可能吗?下面是我的示例模式 var chapter = new Schema({ title:String, startPage:Number, endPage:Number }); var keyPoint = new Schema({ text:String, mentionInChapter:[{ type: Schema.ObjectId, ref: 'chapter

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

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(函数(err,doc){ 如果(!err) 控制台日志(doc); });

是否有一种方法可以实现这一点,以便我检索的图书文档填充了所有详细信息?

您可以尝试使用如下方法:

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);
   });
});

谢谢你,阿泰姆。在上述解决方案中,您将章节和关键点作为独立的文档而不是嵌入文档。Keypoint会让我觉得有意义,因为这会增加尺寸。但想知道我是否要一直用这本书来检索章节,我是否需要将其作为一个单独的文档集合?mongoose
populate
非常灵活,所以您可以尝试我的示例,并选择一个对您的案例最有用的。再次感谢Artem的快速回复。如果我运行版本2,我会得到InCapter的空白数组。并且没有抛出错误。因此,它仍然没有人口。路径关键点是一个数组。所以不确定这个path keyPoints.referenceInCapter是否可以工作?应该可以。例如,人们解决同一任务时,尝试添加
model
选项,以将两个模型都作为“章节”或模型作为“注释记号”来填充ConfigTested,但结果仍然相同。mongodb中的数据符合本要点-。想知道我是否以错误的方式存储数据?