2016-04-23 124 views
0

我正在努力与猫鼬的人口。假设我有一个包含许多嵌套对象的大文档,这些嵌套对象并不总是得到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 
      } 
     ] 
    } 
}; 

所以我会'findOne'这种类型的文件一次,在需要的时候填充某些部分对我的具体使用情况进行保存,然后。据我所见,这个主题的大部分问题都是指在操作后保存填充文档,但我想保持原样,并将(填充的)数据传递给其他某个函数。

例如,我只想获得某个博览会物业的所有“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; 

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

谢谢你的时间。

回答

0

假设你有quest.subQuests成员一个任务模式,我想是这样的:

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

(这不会修改原始任务DOC)

+0

谢谢您的回答。我其实没有quest.subQuests,而是GameClient.quests.exposition [0] .subQuests。这可以确保我具有描述性的任务数据和任务安排以及它们之间的关系。 – mrpool89

+0

不客气!游戏客户端是猫鼬模式吗? – lipp

+0

是的。这基本上是我上面发布的那个。 – mrpool89