2016-04-23 9 views
0

私はマングースの人口に苦労しています。私は、スキーマを持っていない多くのネストされたオブジェクトを持つ大きなドキュメントを持っていると仮定するか、単純にType.Mixedです。この文書はこのようなものになるだろうためネストされたオブジェクトをマングースで非同期に取り込む方法は?

Aスキーマ:必要に応じて私の具体的な使用例のための特定の部分を移植する際

{ 
    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"を持つことができるところでは、はい、再帰的スキーマが必要ですが、今のところこれは主要な問題ではありません。 questInfoがメイン文書から抽出され、その機能への引数として渡されると

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

:問題は、私はこのようにそれを反復処理したいということです。しかし、この行では:

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

(これはオリジナルのクエストドキュメントは変更されません。)あなたの答えのための

+0

感謝を。私は実際にquest.subQuestsを持っていません。むしろGameClient.quests.exposition [0] .subQuestsです。これにより、わかりやすいクエストデータとクエストの配置とその関係を分けることができます。 – mrpool89

+0

あなたはようこそ! gameclientはmongooseスキーマですか? – lipp

+0

はい、そうです。それは基本的に私が上に投稿したものです。 – mrpool89

関連する問題