1

使用 MongoDB 存储来自 nmap 网络扫描的结果,并尝试找出构建数据的最佳方法。

目前我有以下内容:

{
    "_id" : ObjectId("525f94097025166583e18eba"),
    "ip" : "127.0.0.1",
    "services" : [ 
        {
            "port" : "22",
            "port_info" : [ 
                {
                    "product" : "ssh",
                    "version" : "1.0"
                }
            ]
        }, 
        {
            "port" : "80",
            "port_info" : [ 
                {
                    "product" : "apache",
                    "version" : "2.0"
                }
            ]
        }
    ]
}

例如,我可以找到打开端口 22 的主机,例如仅针对 127.0.0.1 的主机

db.hosts.find({ ip : "127.0.0.1"}, {"services" : { $elemMatch : { port : "22" }}})

但我不确定,例如如何找到所有具有“产品”的主机:“ssh”尝试确实如此,但我得到一个语法错误

db.hosts.find({ ip : "127.0.0.1"}, { services.port_info : { $elemMatch : { product : "ssh"    }}})

然后假设我想向“port_info”添加另一个元素,可能类似于协议:tcp

我将如何进行更新,我会说类似 update where ip : 127.0.0.1 and product is ssh?

4

1 回答 1

2
  1. 语法错误是因为您必须使用引号services.port_info
  2. 但是,无论如何$elemMatch 目前都不支持嵌套字段
  3. 幸运的是,您不需要$elemMatch这种查询

这应该这样做:

db.hosts.find({ ip : "127.0.0.1"}, { "services.port_info.product" : "ssh" });

$elemMatch如果要匹配数组对象内的多个条件,则需要此选项,例如“查找端口为 9000 且协议为 UDP 的所有位置”。这将不受您的数据结构的支持。我不确定为什么port_info是一个对象数组(也许对于一个端口可能属于两个不同服务的不确定情况?) - 如果它是一个对象,甚至$elemMatch会被支持。

另外,请记住,这样的查询将始终返回整个对象。

于 2013-10-17T21:26:05.910 回答