2016-05-05 8 views
0

Ich verwende eine verschachtelte Funktion, um zwei Methoden zum Duplizieren einer Reihe von Dokumenten aufzurufen. Die Dokumente stammen aus zwei verschiedenen Sammlungen, sind jedoch wie im Folgenden gezeigt durch das Feld treeBranches verknüpft.forEach über Cursor

Bäume Sammlung

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

Branchen Sammlung

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

Ich verstehe nicht, wie die _id jedes bestehenden Filialdokument innerhalb branches.forEach erhalten. Wenn ich das jetzt ausführe, werden mehrere Zweigdokumente erstellt, aber jeder dupliziert den ersten vorhandenen Zweig unabhängig davon, wie viele existieren. Wie kann ich var currentBranchId = Branches.findOne({})._id; bearbeiten, um diese _id zu bekommen und richtig über das Set zu legen?

CODE EDITED einzuarbeiten ANTWORT

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

Antwort

0

Sie können einen Cursor mit forEach iterieren (genau wie ein Array), so zum Beispiel:

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

Es macht keinen Sinn, ein forEach() zu tun über einen Cursor und dann eine findOne innerhalb der Schleife, da forEach() jedes Objekt der anonymen Funktion übergeben wird.

Es ist nicht klar aus Ihrer Frage, wie Sie entscheiden, welche Zweige zu welchem ​​Baum gehören.

Wenn ich eine denormalized Kopie Ihrer ursprünglichen Trees Sammlung schaffen wollte ich tun könnte folgendes:

+0

Danke Michel, auf halbem Weg dort - Sie löste mein erstes Problem mit '(b)' - I didn Ich weiß, dass ich das verwenden könnte, ohne weiter zu definieren, welches Dokument es war. Was Ihre Frage anbelangt, sind die Zweige, die zu jedem Baum gehören, diejenigen, deren IDs im Array 'treeBranches' existieren. Mit dem ersten Teil Ihrer Lösung konnte ich nun eine doppelte Version des Baums und der beiden Zweige erstellen. Aber ich muss die _id, die für jeden Zweig erstellt wurde, von der inneren Funktion an die äußere Funktion übergeben, die zu treebranches in der neuen Struktur hinzugefügt werden soll. Ich kann es nicht in der inneren Funktion tun, da der neue Baum nicht existiert. – Bren

+0

Ich glaube nicht, dass ich den zweiten Block Code brauche, da 1) ich weiß, welchen Baum ich dupliziere und 2) ich alle Dokumente in ihren vorhandenen Sammlungen dupliziere, aber mit neuen IDs. – Bren

+0

Danke Michel, ich werde eine separate Frage zum Übergang zwischen den Funktionen stellen, da ich denke, dass ich hier zu viele Punkte kombiniere. – Bren

Verwandte Themen