MongoDB регистрирует подозрительный трафик

Я хотел бы сохранить коллекцию подозрительного трафика, которая напоминает следующую схему:

"_id": ObjectId(###),
"count": NumberInt(6),
"ip": NumberInt(2147483647),
"requests": {
[ "uri": "/path/to/something/",
"last": NumberInt(1419023477)
"count": NumberInt(2) ],
[ "uri": "/path/to/something/else/",
"last": NumberInt(1419023478)
"count": NumberInt(4) ]
}

Может ли кто-нибудь помочь мне с одним упертом, который будет:

  • добавить URI запроса во встроенный массив документов
  • увеличить количество запросов для этого URI
  • установить дату последнего запроса для этого URI
  • и, наконец, увеличить общее количество запросов для этого IP

Кто-то попросил меня опубликовать то, что я получил до сих пор:

$db->coll->update(array('ip' => $ip),
array('$addToSet' => array('req' => array('$set' => array('last'  => $timestamp),
'$inc' => array('count' => 1)))),
array('upsert' => true)
);

Как видите, он еще не ищет встроенный документ с соответствующим uri ($ uri)

1

Решение

Я бы изменил структуру вашего документа. Наивно, один IP будет отправлять запросы к постоянно растущей коллекции URI. Иметь массивы, которые растут без ограничений, не очень хорошая идея в MongoDB, и вам будет трудно и медленно работать с ними. Я бы посоветовал основывать каждый документ на запросе, а не на IP, чтобы документы выглядели так:

{
"ip" : "192.168.1.1",
"uri" : "/food/cookies/chocolatechip",
"timestamp" : ISODate("2014-12-22T18:44:26.860Z")
}

Я положил в last в качестве даты и времени, что почти всегда является тем, что вы предпочитаете для datetime в MongoDB. Я переименовал его в отметку времени, так как больше не имеет смысла его называть last, Кроме того, почему вы храните ip как число? Я не эксперт по правилам для IP-адресов, но я думаю, что это опасно, поскольку 192.168.1.1 — это не тот же IP-адрес, что и 19.216.81.1, но оба дают одно и то же число, когда вы отбрасываете.

Теперь вы выполняете все свои задачи за один переход с одной вставкой нового документа. Ты можешь использовать .count() чтобы найти счет и .sort() чтобы найти самые последние запросы, и может индексировать необходимые запросы, чтобы эти операции были быстрыми.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]