MongoDB记录可疑流量

时间:2014-12-19 21:19:07

标签: php mongodb mongodb-php

我想保留一组类似于以下架构的可疑流量:

"_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 个答案:

答案 0 :(得分:0)

我会更改您的文档结构。天真地,一个IP将向不断增长的URI集合发出请求。拥有无限制增长的数组在MongoDB中不是一个好主意,你会发现处理它们既缓慢又麻烦。我建议将每个文档基于请求,而不是基于IP,因此文档看起来像:

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

我将last作为日期时间放入,这几乎总是你应该更喜欢MongoDB中的日期时间。我将其重命名为时间戳,因为称它为last不再有意义。另外,为什么要将ip存储为数字?我不是IP地址规则的专家,但我认为这是危险的,因为192.168.1.1与19.216.81.1的IP地址不同,但是当你放弃。时,两者都给出相同的数字。

现在,您只需插入一个新文档即可完成单个upsert的所有目标。您可以使用.count()查找计数,使用.sort()查找最新请求,并可以索引必要的查询,以便快速执行这些操作。