2013-06-26 3 views
1

Я пытаюсь перебрать массив и добавить элементы в массив в базу данных mongodb, если он уже не существует. Внутри цикла я пытаюсь запросить мою базу данных, если следующий элемент в массиве уже находится в базе данных. Однако внутри функции обратного вызова console.log всегда возвращает последний элемент массива.Mongoose Для каждого элемента в цикле

for(var j = 0 ; j < req.body.array.length; j++){ 
    var currenttag = req.body.array[j]; 
    Tag.findOne({tagname : currenttag}, 
     function(err,tag){ 
     if(tag){ 
      console.log("tag exists"); 
     } 
     else{ 
      console.log(currenttag);//returns the last tag in the array for array.length times 
      var newtag = new Tag({tagname : currenttag}); 
      newtag.save(); 
     } 
     }); 
    } 
+2

Не могли бы вы дать более подробную информацию о том, что не работает должным образом. Вопрос непонятен. – verybadalloc

+0

только что отредактировал этот вопрос, пожалуйста, дайте мне знать, если он еще не ясен. –

ответ

3

Я думаю, что ошибка связана с тем, как замыкания обрабатываются в Javascript. Пожалуйста, см. Мой ответ here для получения более подробной информации о том, что это значит.

В вашем случае обработчик события получает ссылку на currentTag, которая установлена ​​на последний элемент цикла.

Чтобы решить эту проблему, вы можете попробовать сделать следующее:

var createTagIfMissing = function (currentTag){ 

Tag.findOne({tagname : currenttag}, 
     function(err,tag){ 
     if(tag){ 
      console.log("tag exists"); 
     } 
     else{ 
      console.log(currenttag); 
      var newtag = new Tag({tagname : currenttag}); 
      newtag.save(); 
     } 
     }); 
} 

for(var j = 0 ; j < req.body.array.length; j++){ 
    createTagIfMissing(req.body.array[j]); 
} 

Вы можете нажать еще дальше, и определить этот метод в качестве одного из тегов статики:

//In your db.js file, before mongoose.model('Tag',Tag); 
Tag.statics.createTagIfMissing = function(tag){ 
    this.findOne //... 
} 

Тогда, в вашем коде маршрутизатора:

for(var j = 0 ; j < req.body.array.length; j++){ 
    Tag.createTagIfMissing(req.body.array[j]); 
} 
+0

спасибо за подробный ответ –

+0

У этого есть некоторая проблема, когда есть изменение в массиве, все записывается снова. Это работает только тогда, когда в массиве нет изменений. –