Монго база данных с подсчетом laravel запрос занимает много времени - PullRequest
0 голосов
/ 11 декабря 2019

У меня проблема и я много искал в интернете безрезультатно. У меня есть база данных 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

, это заняло много времени, так как в моей базе данных более 3 миллионов записей. и я использую этот код для извлечения данных из Монго

$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();

, поэтому, пожалуйста, помогите мне, если у вас есть какие-либо предложения по решению этой проблемы, так как это очень большая проблема для меня

1 Ответ

0 голосов
/ 11 декабря 2019

У меня есть кое-что, но вряд ли это идеальное решение.

Вместо обновления вашего запроса вы можете немного обновить базу данных - воспользовавшись конвейером агрегации. Хотя это немного увеличит размер вашей базы данных. Мы добавим новое поле, которое будет содержать только SourceIP.

Попробуйте db.collection.aggregate([{$addFields: { Source: { $regexFind: { input: "$msg", regex: (\w*SourceIP=\w*.[^,]+) } } } }}])

Запрос вернет дополнительное поле Source.

Кроме того, если данные не отличаются разнообразием, возможно, вы можете сохранить их в другой коллекции, используя $count. В зависимости от ваших потребностей и частоты запросов.

Вы можете дополнительно настроить регулярное выражение, чтобы сохранить только IP.

Регулярное выражение здесь: https://rubular.com/r/IqeDtCjJBjlQrW

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...