我有一个产品清单,每个产品都有一个存储在文件中的成分列表:
{ "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)
记录每个产品,但不执行查询。
我做错了什么?
答案 0 :(得分:0)
根据mongodb docs以正确的格式提供正则表达式。
ingredients.findOne( { name : { $regex : new RegExp(i, 'i') } }
顺便说一句,我不知道,monk
图书馆会通过mongoose
之类的查询,请在评论时告诉我。