首页 > 解决方案 > 带有laravel计数的mongo数据库查询需要很长时间

问题描述

我有问题并且在互联网上搜索了很多没有任何结果。我有 mongo 数据库,其中包含这样的数据

{
"_id":ObjectId("5ddfc2da7f86bf52c2472ea5"),
"sys":"2019-11-28",
"time":ISODate("2019-11-28T12:51:38.827Z"),
"time_rcvd":ISODate("2019-11-28T12:51:38.827Z"),
"msg":"51:37 Kayseri Netcom %%01SECLOG/6/SESSION_TEARDOWN(l):IPVer=4,Protocol=icmp,SourceIP=172.16.10.252,DestinationIP=10.10.0.26,SourcePort=8,DestinationPort=0,BeginTime=1574945475,EndTime=1574945475,SendPkts=1,SendBytes=60,RcvPkts=1,RcvBytes=60,SourceVpnID=0,DestinationVpnID=0,SourceZone=tunnel,DestinationZone=trust,PolicyName=tunnel_to_trust,CloseReason=aged-out.",
"syslog_fac":23,
"syslog_sever":6,
"syslog_tag":"12:",
"procid":"12",
"pid":"-",
"level":"INFO"
}

我正在做的是从列 msg 中获取数据并将其拆分以在我使用 laravel 的系统中显示它。我的问题是当用户想要搜索

源IP = 172.16.10.252

因为我的数据库中有超过 300 万条记录,所以花了很长时间。我正在使用此代码从 mongo 检索数据

$data = Logs::where('msg', 'like', '%SourceIP=172.16.10.252')->offset(10)->limit($limit )->get();

但最大的问题是分页,我需要获取记录数才能进行分页,但是获取计数需要很长时间,系统应该很快,这是我用来获取计数的代码

$totalrecords = Logs::where('msg', 'like', '%SourceIP=172.16.10.252')->count();

所以如果你有任何解决这个问题的建议,请帮助我,因为这对我来说是个大问题

标签: phplaravelmongodb

解决方案


我有一些东西,但这并不是一个理想的解决方案。

而不是更新您的查询,您可以稍微更新数据库 - 借助聚合管道。尽管这会稍微增加您的数据库大小。我们将添加一个仅包含 SourceIP 的新字段。

尝试db.collection.aggregate([{$addFields: { Source: { $regexFind: { input: "$msg", regex: (\w*SourceIP=\w*.[^,]+) } } } }}])

该查询将返回一个附加字段 Source。

此外,如果数据缺乏多样性,您可以使用$count. 根据您的需要和查询频率。

您可以进一步调整正则表达式以仅存储 IP。

正则表达式在这里:https ://rubular.com/r/IqeDtCjJBjlQrW


推荐阅读