Php MongoDB记录可疑流量
我想保存一个可疑流量的集合,类似于以下模式:Php MongoDB记录可疑流量,php,mongodb,mongodb-php,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": N
"_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的嵌入文档我将更改您的文档结构。天真地说,一个IP将向不断增长的URI集合发出请求。在MongoDB中,使用无边界增长的阵列不是一个好主意,您会发现处理它们既慢又麻烦。我建议每个文档都基于一个请求,而不是基于IP,因此文档看起来像:
{
"ip" : "192.168.1.1",
"uri" : "/food/cookies/chocolatechip",
"timestamp" : ISODate("2014-12-22T18:44:26.860Z")
}
我把last in作为datetime,这几乎总是MongoDB中datetime的首选。我将其重命名为timestamp,因为将其称为last不再有意义。另外,为什么要将ip存储为一个数字?我不是IP地址规则方面的专家,但我认为这很危险,因为192.168.1.1与19.216.81.1的IP地址不同,但在删除's'时,两者给出的数字相同
现在,您只需插入一个新文档,就可以完成单个upsert的所有目标。您可以使用.count查找计数,使用.sort查找最近的请求,并可以为必要的查询编制索引,以使这些操作更快 你写代码,我们帮你修复。反之亦然。请编辑问题以添加您尝试过的实现。您的文档结构无效。请求是一个对象数组吗?我还没有对你的答案发表评论,wdberkeley。总共有24个固定数量的URI,所以我不担心数组超出范围。但是,正如你所说,如果列表增加,这是一个很好的考虑。IP刚被转换成整数,因为我更喜欢整数: