【问题标题】:MongoDB Logging Suspicious TrafficMongoDB 记录可疑流量
【发布时间】:2015-02-18 20:40:07
【问题描述】:

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

"_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) ]
}

有人可以帮我做一个简单的 upsert 吗:

  • 将请求 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) 的嵌入式文档

【问题讨论】:

  • 您编写代码,我们帮助修复它。不是相反。
  • 请编辑问题以添加您尝试过的实现。
  • 您的文档结构无效。 requests 是一个对象数组吗?
  • 我还没有权限对你的回答发表评论,wdberkeley。 URI 的数量是固定的(总共 24 个),所以我并不担心数组越界。但正如你所说,如果列表增加,这是一件值得考虑的事情。 IP 刚刚转换为整数(只是因为我更喜欢整数):php.net/manual/en/function.ip2long.php

标签: php mongodb mongodb-php


【解决方案1】:

我会更改您的文档结构。天真地,一个 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 地址,但是当您删除 .'s 时,两者都会给出相同的数字。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-10
    • 2017-12-03
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多