使用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.1db.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”中添加另一个元素 protocol:tcp
我怎么做更新,我说更新的地方ip:127.0.0.1和产品是ssh?
答案 0 :(得分:2)
services.port_info
$elemMatch
in nested fields is currently unsupported无论如何$elemMatch
来进行此类查询这应该做:
db.hosts.find({ ip : "127.0.0.1"}, { "services.port_info.product" : "ssh" });
如果要匹配数组对象内的多个条件,则需要 $elemMatch
,例如“查找端口为9000且协议为UDP的所有端口”。这将不支持您的数据结构。我不确定为什么port_info
是一个对象数组(可能是因为端口可能属于两个不同的服务的不确定的位置?) - 如果它是一个对象,即使支持$elemMatch
也是如此
另外,请记住,此类查询将始终返回整个对象。