【问题标题】:Repeating find with a loop in MongoJS在 MongoJS 中使用循环重复查找
【发布时间】:2017-01-21 17:57:07
【问题描述】:

这是经典的 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, ' '));

【问题讨论】:

    标签: javascript node.js mongodb mongojs


    【解决方案1】:

    你能做的就是用这个

    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 调用使用 fororloop 不是一个好主意,因为它会将调用刷新在一起,并且当数组很大时会出现问题。 这将为您提供正确的索引,因为在调用 cb() 之前不会调用下一次迭代

    【讨论】:

    • 显然我在 MongoDB 上花了三个小时后仍然有很多东西要学。 :) 谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-20
    • 2014-03-26
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多