2012-09-25 8 views
0

J'ai un tableau de noms:Comment enregistrer correctement un tableau d'objets avec mongoose + nodejs?

noms var = [ "Kelley", "Amy", "Mark"]

En supposant personne est juste un modèle Mongoose pour nodejs ... Je veux sauver chaque le nom comme un document dans MongoDB ce qui suit:

for(var i = 0; i < names.length; i++) { 
      name_now = names[i]; 
     Person.findOne({ name: name_now}, 
      function(err, doc) { 
       if(!err && !doc) { 
        var personDoc = new PersonDoc(); 
        personDoc.name = name_now; 
        console.log(personDoc.name); 
        personDoc.save(function(err) {}); 
       } else if(!err) { 
        console.log("Person is in the system"); 
       } else { 
        console.log("ERROR: " + err); 
       } 
      } 
     ) 
} 

J'ai des problèmes que je garde geting un « programme création d'erreur: MongoError: E11000 dupliquer l'index d'erreur clé: ..... clé dup: {: » Marque"}". Et il semble qu'il essaie d'insérer "Mark" (le dernier élément de la liste) 3 fois par opposition à chacun des noms de la liste. Lorsque j'essaie d'imprimer le nom de la personne en cours dans la boucle (avec le fichier console.log (personDoc.name);), j'obtiens "Mark" 3 fois ... et il semble qu'il ne soit sauvegardé "Mark" dans la base de données et personne d'autre ... quelle est la bonne façon de faire face à cela?

Répondre

1

Au cours des findOne callbacks, name_now va toujours être réglé sur le dernier nom names parce que la boucle for se termine avant le premier rappel est même appelé. Vous devez créer une fonction immédiate pour capturer la valeur name_now actuelle au cours de chaque itération et conserver pour une utilisation dans le rappel:

for(var i = 0; i < names.length; i++) { 
    (function (name_now) { 
     Person.findOne({ name: name_now}, 
      function(err, doc) { 
       if(!err && !doc) { 
        var personDoc = new PersonDoc(); 
        personDoc.name = name_now; 
        console.log(personDoc.name); 
        personDoc.save(function(err) {}); 
       } else if(!err) { 
        console.log("Person is in the system"); 
       } else { 
        console.log("ERROR: " + err); 
       } 
      } 
     ); 
    )(names[i]); 
} 
+0

Cela fonctionne très bien, merci! Mais je veux après que la boucle for s'exécute, dans la même fonction pour faire un Person.find ({}) pour obtenir tous les documents après insertion. Comment puis-je m'assurer que la boucle se termine avant que j'effectue le Person.find ({})? – Rolando

+0

@Damascusi Il est préférable de publier cette question comme une question distincte car elle est non triviale. Faites quelques recherches d'abord car c'est un cas courant. – JohnnyHK

Questions connexes