2016-04-23 5 views
0

Я борюсь с населением в мангусте. Предполагая, что у меня есть большой документ со многими вложенными объектами, которые не всегда получают Schemas или просто 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 «» этот тип документа один раз, сохранить его, а затем при необходимости заполнить некоторые детали для моих конкретных случаев использования , Насколько я вижу, большинство вопросов к этой теме относятся к сохранению заполненного документа после его манипулирования, но я хочу сохранить документ как есть и просто передать (заполненные) данные в какую-то другую функцию.

Например, я просто хочу получить все «подпрограммы» определенного поиска свойства экспозиции. Там, где у них также могут быть свои «подкасты», да, должна быть рекурсивная схема, но пока это не главная проблема. Проблема заключается в том, что я хочу итерацию над ним, как это:

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

(Это не изменит оригинальный квест док.)

+0

Спасибо за ваш ответ. На самом деле у меня нет quest.subQuests, это скорее GameClient.quests.exposition [0] .subQuests. Это гарантирует, что я буду иметь описательные данные квеста и расположение квестов и их отношений. – mrpool89

+0

Добро пожаловать! Является ли gameclient схемой мангуста? – lipp

+0

Да, это так. Это в основном тот, который я написал выше. – mrpool89