如何在mongoose中异步填充嵌套对象?

时间:2016-04-23 18:27:17

标签: javascript node.js mongodb mongoose mongoose-populate

我在猫鼬中与人口挣扎。假设我有一个包含许多嵌套对象的大型文档,这些对象并不总是有Schema或只是Type.Mixed。

本文档的架构如下:

{
    token: String,
    group: String,
    connectionStatus: String,
    activeQuestLine: String,
    quests:
    {
        exposition: [
            {
                content: { type: mongoose.Schema.Types.ObjectId, ref: 'Quest' },
                status: String,
                trigger:
                {
                    name: String,
                    param: mongoose.Schema.Types.Mixed
                },
                subQuests:
                [
                    {
                        content: { type: mongoose.Schema.Types.ObjectId, ref: 'Quest' },
                        status: String,
                        trigger:
                        {
                            name: String,
                            param: mongoose.Schema.Types.Mixed
                        }
                    }
                ]
            }
        ],
        conflict: [
            {
                content: { type: mongoose.Schema.Types.ObjectId, ref: 'Quest' },
                status: String
            }
        ],
        resolution: [
            {
                content: { type: mongoose.Schema.Types.ObjectId, ref: 'Quest' },
                status: String
            }
        ]
    },
    inventory:
    {
        maxSlots: Number,
        slots: [
            {
                itemType: String,
                content: mongoose.Schema.Types.Mixed,
                empty: Boolean
            }
        ]
    }
};

所以我会找到一个''这种类型的文档一次,保存,然后在需要时为我的特定用例填充某些部分。据我所知,本主题的大多数问题都是指在操作后保存已填充的文档,但我希望保持文档不变,只需将(填充的)数据传递给其他函数即可。

例如,我只想获得所有'' subQuests''对博览会财产的某种追求。那些人也可以拥有他们的'subQuests',是的,应该有一个递归的Schema,但是现在这不是主要的问题。问题是我想像这样迭代它:

async.forEachSeries(
   questInfo.subQuests,
   function (subQuestInfo, eachCallback)
   { 
       QuestManager.getQuest(subQuestInfo.content, function (subQuest)
       {
           if (!subQuest) throw 'SubQuest ' + subQuestInfo.content + ' not found';
           subQuestInfo.content = subQuest;
           eachCallback();
       });
   },
   function (err)
   {
       if (err) throw err;
       activeQuests.push(questInfo);
   });

从主文档中提取questInfo并将其作为参数传递给该功能。但在这一行:

subQuestInfo.content = subQuest;

'内容的价值'仍然只是ObjectId,所以以前的值。我的作业显然没有影响!这是一种人工尝试,有没有更好的方法来解决这个问题?

感谢您的时间。

1 个答案:

答案 0 :(得分:0)

假设你有一个带有quest.subQuests成员的Quest架构,我会这样:

Quest.methods.getSubQuests = function(done) {
  var getSubQuestFns = this.subQuests.map(function(subQuest) {
    return QuestManager.getQuest.bind(QuestManager, subQuest.content)
  })
  async.parallel(getSubQuestFns, done)
}

// get some Quest instance
quest.getSubQuests(function(err, subQuests) {
  // whatever
})

(这不会修改原始任务文档。)