我想保留一组类似于以下架构的可疑流量:
"_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) ]
}
有人可以通过以下方式帮助我:
有人让我发布我到目前为止的内容:
$db->coll->update(array('ip' => $ip),
array('$addToSet' => array('req' => array('$set' => array('last' => $timestamp),
'$inc' => array('count' => 1)))),
array('upsert' => true)
);
正如您所看到的,它尚未使用匹配的uri($ uri)搜索嵌入式文档
答案 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()
查找最新请求,并可以索引必要的查询,以便快速执行这些操作。