monk查询异步循环?

时间:2015-10-21 11:06:21

标签: node.js mongodb node-async monk

我有一个产品清单,每个产品都有一个存储在文件中的成分列表:

{ "name": "test", "inci": ['a', 'b', 'n'] },
{ "name": "test", "inci": ['a', 'b', 'n'] }

我需要检查MongoDB集合中是否存在给定成分:

var db = require('monk')('localhost/mydb');
var fs = require("fs");
var async = require("async");

var str = fs.readFileSync("products-parsed.json", "utf8");

var products = JSON.parse('[' + str + ']');

// collections
var ingredients = db.get('ingredients');

function escapeRegExp(str) {
  return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
}

async.forEach(products, function(p, nextProduct) {
  async.forEach(p.inci, function(i, nextIngredient) {

    // Escape characters to prepare the regex
    i = escapeRegExp(i.replace('*', '')).trim();

    // Query the ingredient name passing a regexp as value to look for case insensitive matches
    ingredients.findOne({name: new RegExp(i, 'i')}, function(err, result) {
      if (err) { console.log(err); }

      if (!result) {
        console.log('ERROR:', i);
      } else {
        console.log('OK:', i);
      }

      // Proceed to next ingredient
      nextIngredient();

    });

  }, function(err) {
    // Proceed to next product
    nextProduct();
  });
}, function(err) {
  // end
  process.exit();
});

注意:

如果我使用一个小输入数组(小于2.000行左右),那么一切正常。 如果我使用整个阵列(15.000行),则不会console.log(i)记录每个产品,但不执行查询。
我做错了什么?

1 个答案:

答案 0 :(得分:0)

根据mongodb docs以正确的格式提供正则表达式。

ingredients.findOne( { name : { $regex : new RegExp(i, 'i') } }

顺便说一句,我不知道,monk图书馆会通过mongoose之类的查询,请在评论时告诉我。