2016-05-05 4 views
0

Я использую вложенную функцию для вызова двух методов для дублирования набора документов. Документы поступают из двух разных коллекций, но связаны между собой полем treeBranches, как показано ниже.forEach over cursor

коллекция Деревья

{ 
    _id: "tree_1", 
    treeBranches: ["branch_1","branch_2"], 
    ... 
} 

Ветви коллекция

{ 
    _id: "branch_1", 
    branchName: "Branch 1", 
    ... 
} 
{ 
    _id: "branch_2", 
    branchName: "Branch 2", 
    ... 
} 

Я не понимаю, как получить _id каждого существующего филиала документа в branches.forEach. Прямо сейчас, когда я запускаю это, создаются несколько документов филиала, но каждый дублирует первую существующую ветвь независимо от того, сколько ее существует. Как я могу отредактировать var currentBranchId = Branches.findOne({})._id;, чтобы получить это _id и правильно ли перебрать петлю?

КОД отредактирован Скорпоратировать ОТВЕТ

Template.Actions.events({ 
    'change .action-selection': function(e) { 
     e.preventDefault(); 

     var selection = $(e.target).val(); 

     var currentTreeId = this._id; 
     var branches = Branches.find({_id:{$in:this.treeBranches}}); 

     switch(selection) { 
      case "tree-repeat": 
       return Meteor.call('treeRepeat', currentTreeId, function() { 
        branches.forEach(function(b) { 
         var currentBranchId = b._id; 
         Meteor.call('treeBranchesRepeat', currentBranchId, function (branchId) { 
         }); 
        }); 
       }); 
       break; 
       … 
      } 
     } 
    }); 

    Meteor.methods({ 
     treeRepeat: function(currentTreeId) { 
      check(currentTreeId, String); 

     var tree = Trees.findOne({_id:currentTreeId}, {fields:{_id:0, treeBranches:0}}); 

     var treeExtended = _.extend(tree, { 
      treeBranches: [?]//NEED IDS FROM NEW BRANCHES 
     }); 

     var treeId = Trees.insert(treeExtended); 

      return { 
       _id: treeId 
      }; 
     }, 
     treeBranchesRepeat: function(currentBranchId) { 
      check(currentBranchId, String); 

      var branch = Branches.findOne({_id:currentBranchId}, {fields: {_id: 0}}); 

      var branchId = Branches.insert(branch); 

      return { 
       _id: branchId 
      }; 
     } 
    }); 

ответ

0

Вы можете перебрать курсор forEach (так же, как массив), так, например:

var cursor = Branches.find(); 
cursor.forEach(function(b){ // b will be a single branch document 
    console.log(b._id); // you can get its _id directly 
    console.log(b.branchName); // or any other key 
}); 

Это не имеет никакого смысла, чтобы сделать forEach() над курсором, а затем выполните findOne внутри цикла, так как forEach() будет передавать каждый объект по очереди анонимной функции.

Непонятно из вашего вопроса, как вы решаете, какие ветви принадлежат дереву.

Если бы я хотел создать Денормализованную копию оригинального Trees коллекции я мог бы сделать следующее:

+0

Спасибо Мишеля, на полпути - вы решили мою первую проблему с '(б)' - Я Бесполезным Я знаю, что могу использовать это, не уточняя, какой именно документ. Что касается вашего вопроса, ветвями, которые принадлежат каждому дереву, являются те, чьи идентификаторы существуют в массиве 'treeBranches'. Используя первую часть вашего решения, я теперь смог создать дублируемую версию дерева и обоих ветвей. Но мне нужно передать _id, созданный для каждой ветви, из внутренней функции во внешнюю функцию, чтобы добавить к treeBranches в новое дерево. Я не могу сделать это во внутренней функции, так как новое дерево не существует. – Bren

+0

Я не верю, что мне нужен второй блок кода, так как 1) Я знаю, какое дерево я дублирую, и 2) Я дублирую все документы в своих существующих коллекциях, но с новыми идентификаторами. – Bren

+0

Спасибо Мишель, я собираюсь опубликовать отдельный вопрос о переходе между функциями, поскольку я думаю, что я совмещаю слишком много пунктов здесь. – Bren

Смежные вопросы