填充引用对象,它也是一个引用对象 mongoose

Populate reference object which is also a reference object mongoose

我有一个名为 Message 的模式,定义如下:

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

module.exports('Message',messageSchema);

我有另一个名为 Topic 的架构,它使用 'Message' 作为参考对象。

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

module.exports('Topic',topicSchema);

我有一个名为 Thread 的模式,它使用 'Topic' 个对象引用数组。

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

module.exports('Thread',threadSchema);

如果我们有 'Thread' 文档,如何访问所有 'Message' 元素?

我尝试执行以下操作:

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

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

经过进一步调查,我能够解决问题。描述了一种不涉及嵌套 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.

由于我们已将 'thread' 字段填充为数组,因此我们可以遍历该字段的每个成员,用基础 'message' 模型填充 'topic' 字段。

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 代理。