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.
D'oh! Richtig, denn for-Schleifen sind nicht asynchron wie forEach(), oder? Klappt wunderbar. – seport
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 –