我有问题,并且在互联网上进行了大量搜索,没有任何结果。我有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的系统中。我的问题是当用户想搜索
时SourceIP = 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();
因此,如果您有任何解决此问题的建议,请帮助我,因为这对我来说是一个很大的问题
我有一些东西,但这不是一个理想的解决方案。
除了更新查询之外,您还可以稍微更新数据库-借助聚合管道。虽然这会稍微增加数据库的大小。我们将添加一个仅包含SourceIP的新字段。
尝试db.collection.aggregate([{$addFields: { Source: { $regexFind: { input: "$msg", regex: (\w*SourceIP=\w*.[^,]+) } } } }}])
查询将返回一个附加字段Source。
此外,如果数据缺乏多样性,则可以使用$count
将其存储在其他集合中。根据您的需要和查询的频率。
您可以进一步调整正则表达式以仅存储IP。
正则表达式在这里:https://rubular.com/r/IqeDtCjJBjlQrW