2016-05-05 92 views
0

我正在使用嵌套函數調用兩個方法來複制一組文檔。文檔來自兩個不同的集合,但通過treeBranches字段鏈接,如下所示。for each光標

樹集合

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

分行收集

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

我不明白如何讓每個現有分支文件_idbranches.forEach。現在,當我運行這個時,創建了多個分支文檔,但是每個都重複第一個現有分支,而不管存在多少個分支文檔。我如何編輯var currentBranchId = Branches.findOne({})._id;以獲得此_id並正確地循環播放該集?

代碼編輯,以納入ANSWER

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

謝謝米歇爾,中途有 - 你解決了我的'(B)'第一個問題 - 我沒不知道我可以使用它,而不必進一步定義它是哪個文檔。至於你的問題,屬於每棵樹的分支是那些在'treeBranches'數組中存在id的分支。使用解決方案的第一部分,我現在可以創建樹和兩個分支的重複版本。但我需要將爲每個分支創建的_id從內部函數傳遞到外部函數,以添加到新樹中的treeBranches。由於新樹不存在,我無法在內部函數中執行此操作。 – Bren

+0

我不相信我需要第二塊代碼,因爲1)我知道我複製了哪棵樹,以及2)我複製了其現有集合中的所有文檔,但使用了新的ID。 – Bren

+0

感謝Michel,我將發佈一個關於函數之間傳遞的單獨問題,因爲我認爲我在這裏結合了太多的觀點。 – Bren