2017-01-24 4 views
0

Ich habe zwei Sammlungen: Rezepte und Zutaten. Ich möchte in der Lage sein, die Zutaten-ID in den Rezepteinträgen zu speichern.Erstellen und Verknüpfen von Einträgen aus zwei Sammlungen in Mongoose

Wenn ein Benutzer ein Rezept erstellt, bieten sie eine Reihe von Zutaten:

"ingredients": [ 
    { 
     "ingredient": "full cream milk", 
     "quantity": "4 cups (1L)" 
    }, 
    { 
     "ingredient": "elbow macaroni", 
     "quantity": "2 cups" 

    }, 
    { 
     "ingredient": "cheddar cheese", 
     "qualifier": "grated", 
     "quantity": "2 cups" 

    } 
] 

dann, bevor das Rezept gespeichert, die wir in diesem Array durch jedes Objekt gehen und die Zutat mit dem angegebenen Namen erstellen in Zutaten, wenn es nicht vorhanden ist:

if(req.body.ingredients != undefined){ 
    var ingredientsArr = req.body.ingredients; 
    for(i=0;i<ingredientsArr.length;i++){ 
     Ingredient.update({"name":new RegExp(ingredientsArr[i].ingredient,"i")},{$setOnInsert:{"name":ingredientsArr[i].ingredient}},{upsert:true},function(err,ingredients){ 
      if(err){ return next(err) } 
     }) 
    } 
} 

Jetzt muss ich gehen ist was zu tun ist durch ingredientsArr und ersetzen _id jedes ingredient: Feld mit dem entsprechenden.

Ingredient.findOne({"name":new RegExp(ingredientsArr[i].ingredient,"i")},function(err, ingredient){ 
      var id = ingredient._id 
}) 

Aber ich habe Umfang Probleme, bei denen ich nicht id außerhalb der findOne() Callback-Funktion zugreifen kann, und ich kann von innen nicht ingredientsArr zugreifen:

kann ich die _id mit findOne() finden. Ich bin sicher, ich vermisse hier etwas Offensichtliches, aber ich konnte keine Hilfe finden, als ich versuchte, mein Problem zu googeln.

Antwort

1

if (req.body.ingredients != undefined) { 
 
    var ingredientsArr = req.body.ingredients; 
 
    ingredientsArr.forEach((item,i) => { 
 
    Ingredient.findOne({ 
 
     "name": item.ingredient 
 
    }, function(err, ingredient) { 
 
     if (err) { 
 
     return next(err) 
 
     }else{ 
 
     //do you mean this? 
 
     item.ingredient = ingredient._id 
 
     // or ingredientsArr[i].ingredient = ingredient._id ? 
 
     } 
 
    }) 
 
    })

+0

D'oh! Richtig, denn for-Schleifen sind nicht asynchron wie forEach(), oder? Klappt wunderbar. – seport

+1

Wenn Sie diese Daten verwenden möchten, müssen Sie alle Rückrufe abwarten, Sie können jeden Rückruf markieren und einchecken, aber ich empfehle Verwendung versprechen, siehe https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Referenz/Global_Objects/Versprechen/alle –

Verwandte Themen