Javascript 在MongoJS中使用循环重复查找

Javascript 在MongoJS中使用循环重复查找,javascript,node.js,mongodb,mongojs,Javascript,Node.js,Mongodb,Mongojs,这是JavaScript闭包与循环变量之间的经典问题,但有一个转折点。有一个MongoDB集合包含已存档的推文。我必须对它执行查找操作,搜索各种搜索词。这些单词以字符串的形式存在于数组中,必须单独查找它们,所有结果都将在一个JSON响应中返回 最简单的方法似乎是在数组中运行for循环,并对每个元素执行MongoJS find()操作。虽然这实际上起作用并返回正确的数据,但循环变量在回调函数中仍然不可访问,因为它始终是4—循环的最后一个可能值,数组最后一个元素的索引 我需要知道调用回调时循环变量的

这是JavaScript闭包与循环变量之间的经典问题,但有一个转折点。有一个MongoDB集合包含已存档的推文。我必须对它执行查找操作,搜索各种搜索词。这些单词以字符串的形式存在于数组中,必须单独查找它们,所有结果都将在一个JSON响应中返回

最简单的方法似乎是在数组中运行for循环,并对每个元素执行MongoJS find()操作。虽然这实际上起作用并返回正确的数据,但循环变量在回调函数中仍然不可访问,因为它始终是4—循环的最后一个可能值,数组最后一个元素的索引

我需要知道调用回调时循环变量的正确值。有人知道怎么做吗?谢谢

  var searchwords = ['java', 'javascript', 'ruby', 'scala', 'python'];
  var json = new Array();

  for(t in searchwords) {

        var regexp = new RegExp('\\b'+searchwords[t]+'\\b', 'gi');
        coll.find({ 'timestamp_ms': { $gte: String(startdate) },
                    'timestamp_ms': { $ne: undefined },
                    'text': regexp
                  }, function(err, docs) {
                                          json.push({ 
                                                      'searchword': searchwords[t],
                                                      'tweets': docs.length
                                                    });
                                          console.log(t+' : '+docs.length);
                                        });

  }

  res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' });
  res.end(JSON.stringify(json, null, ' '));

你能做的就是用这个

var i = 0;
async.eachSeries(searchwords , function(word, cb){
    var regexp = new RegExp('\\b'+searchwords[t]+'\\b', 'gi');
    coll.find({ 'timestamp_ms': { $gte: String(startdate) },
                'timestamp_ms': { $ne: undefined },
                'text': regexp
              }, function(err, docs) {
                                      json.push({ 
                                                  'searchword':searchwords[t],
                                                  'tweets': docs.length
                                                });
                                      console.log(i+' : '+docs.length);
                                      i++;
                                      cb();
                                    });
})
对db调用使用foorloop不是一个好主意,因为它将一起刷新调用,并且当数组很大时会出现问题。
这将为您提供正确的索引,因为在调用cb()之前不会调用下一个迭代

var i = 0;
async.eachSeries(searchwords , function(word, cb){
    var regexp = new RegExp('\\b'+searchwords[t]+'\\b', 'gi');
    coll.find({ 'timestamp_ms': { $gte: String(startdate) },
                'timestamp_ms': { $ne: undefined },
                'text': regexp
              }, function(err, docs) {
                                      json.push({ 
                                                  'searchword':searchwords[t],
                                                  'tweets': docs.length
                                                });
                                      console.log(i+' : '+docs.length);
                                      i++;
                                      cb();
                                    });
})
对db调用使用foorloop不是一个好主意,因为它将一起刷新调用,并且当数组很大时会出现问题。
这将为您提供正确的索引,因为在调用cb()之前不会调用下一个迭代

显然,在与MongoDB相处了三个小时之后,我还有很多东西要学习。:)非常感谢。显然,在与MongoDB相处了三个小时之后,我还有很多东西要学非常感谢。