0

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

{ "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)但不会执行查询。
我究竟做错了什么?

4

1 回答 1

0

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

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

顺便说一句,我不知道,monk图书馆是否会通过类似的查询mongoose,尝试让我知道评论。

于 2015-10-21T11:21:07.713 回答