php - 带有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();
所以如果你有任何解决这个问题的建议,请帮助我,因为这对我来说是个大问题
解决方案
我有一些东西,但这并不是一个理想的解决方案。
而不是更新您的查询,您可以稍微更新数据库 - 借助聚合管道。尽管这会稍微增加您的数据库大小。我们将添加一个仅包含 SourceIP 的新字段。
尝试db.collection.aggregate([{$addFields: { Source: { $regexFind: { input: "$msg", regex: (\w*SourceIP=\w*.[^,]+) } } } }}])
该查询将返回一个附加字段 Source。
此外,如果数据缺乏多样性,您可以使用$count
. 根据您的需要和查询频率。
您可以进一步调整正则表达式以仅存储 IP。
推荐阅读
- sql - 在设定的半径内从表 A 计算和返回表 B 中最近项目的最快方法是什么
- ios - 如何将多个选定的 UISwitch tableViewCell 行中的数组传递到下一个视图控制器
- asynchronous - Flutter 同步连接多个 BLE 设备
- java - 将参数从一个映射传递到另一个映射的正确方法是什么?
- javascript - 将对象中的索引包含到数组中
- python - Google Earth Engine Python API:使用波段列表在图像集合上映射函数
- node.js - 使用 nats 与 angular 与 Hemerajs 微服务服务器讨论
- javascript - 导出 JS 模块而不先导入它
- php - 具有多个值的数组到 Mysql (php)
- php - laravel 范围是否适用于每个模型实例?