【问题标题】:Populate reference object which is also a reference object mongoose填充参考对象,它也是参考对象猫鼬
【发布时间】:2021-03-01 11:42:53
【问题描述】:

我有一个名为 Message 的模式,定义类似:

const messageSchema = new mongoose.Schema({
     name : {type : String}
});

module.exports('Message',messageSchema);

我有另一个名为 Topic 的架构,它使用“消息”作为参考对象。

const topicSchema = new mongoose.Schema({
    topics : { type : mongoose.Schema.Types.ObjectId , ref : 'Message' }
});

module.exports('Topic',topicSchema);

我有一个名为 Thread 的架构,它使用一个“主题”对象引用数组。

const threadSchema = new mongoose.Schema({
    thread : [{ type : mongoose.Schema.Types.ObjectId , ref : 'Topic' }],
    name : {type : String}
});

module.exports('Thread',threadSchema);

如果我们有一个“线程”文档,如何访问所有的“消息”元素?

我尝试了以下操作:

Thread.findOne({name : 'Climate'}).populate('thread').populate('topics').exec(function(err,data){})

但由于 thread 人口有一个数组,所以我遇到了错误。请帮助正确取消引用 message 对象。

【问题讨论】:

  • 提供的代码似乎有些错误。例如,在您的topicSchema 中,您正在导出messageSchema。同样在threadSchema 中,您又在引用Thread 本身?如果这些只是复制粘贴拼写错误,请先更正它们,以便您的架构示例有效。
  • 道歉@JakubASuplicki。这些是简单的复制粘贴错别字。我已更改问题以反映您的 cmets。感谢您指出这一点。

标签: node.js mongoose mongoose-populate


【解决方案1】:

经过进一步调查,我能够解决问题。描述了一个不涉及嵌套exec 语句的简单解决方案。

const myThread = await Thread.find({name : "Climate"}).populate('thread');
//This populates the 'thread' component of the Thread model, which is essentially an array of 'Topic' elements.

由于我们已将“线程”字段填充为数组,因此我们可以遍历该字段的每个成员,使用基本“消息”模型填充存在的“主题”字段。

const myTopic = myThread.thread;
for(let i = 0; i < myTopic.length ; i++)
{
    myCurrentTopic = myTopic[i];
    var myTopicPopulated = await Topic.find({_id : myCurrentTopic._id}).populate('topic');
    //Do further processing

}

这是一种处理此类情况的简单方法,无需使用path 代理。

【讨论】:

  • 您是否尝试过我的回答中建议的嵌套人口?
  • @JakubASuplicki 我试过了。虽然它适用于简单的嵌套模型,但如果底层模型引用对象数组(如我的示例中),它似乎不起作用。也许我的实现是错误的,但我觉得这种方法很简单。
  • 就个人而言,我不推荐这种解决方案,因为它需要对数据库的多个请求,理想情况下可以使用嵌套的population 来处理这些请求,该嵌套population 已针对处理此类情况进行了优化,并降低了执行操作的性能影响它像这样手动。这是使用子文档引用的优点之一。如果不是这样,那么即使 $lookuppipeline 也会更有效率。
  • 明白。我确实觉得反应有点慢。我会试试这个,让你知道结果如何。
猜你喜欢
  • 2017-09-13
  • 2015-01-13
  • 1970-01-01
  • 2014-11-01
  • 2013-01-15
  • 1970-01-01
  • 2016-01-09
  • 1970-01-01
  • 2013-01-25
相关资源
最近更新 更多