我有一个在NodeJS中开发的应用程序,它作为REST API工作并使用来自MongoDB的数据
在MongoDB中,我有一个名为'ftp'的集合,其中包含超过1000万个具有以下结构的文档
{
"_id" : ObjectId("59e7c66911506bd1725cf145"),
"ip" : "72.32.177.76",
"timestamp" : "2017-10-16T02:30:26-04:00",
"data" : {
"banner" : "220-FileZilla Server version 0.9.41 beta\r\n"
}
}
“data.banner”字段是一个hased索引
从NoodeJs我创建一个聚合查询,使用正则表达式过滤一串文本,对结果进行分组和计数。
function getData(timeInit, table, textSearch, res) {
MongoClient.connect(url, function (err, db) {
if (err) throw err;
db.collection(table).aggregate([
{
$match: { 'data.banner': $regex:textSearch}
}, {
$group: {
_id: '$data.banner',
num: { $sum: 1 },
}
},
{
$sort: {
num: -1
}
},{
$limit:5
}
], {
allowDiskUse: true
}
).toArray(function (err, result) {
if (err) throw err;
var timeFinal = new Date();
var data = {
result: result,
timeLapse: (timeFinal - timeInit) / 1000,
numResult: result.length
};
res.send(data);
db.close();
});
});
};
使用正则表达式的查询大约需要8秒才能返回结果,我认为时间过长,因为正则表达式不是最佳的。
我的问题是如何使过滤器以最佳方式搜索包含文本的文档,从而缩短响应时间。
如果有人知道如何优化这种类型的查询,我会非常感激。