Mongodb嵌入结构更新和搜索?
使用MongoDB存储nmap网络扫描的结果,并尝试找出构造数据的最佳方法 目前,我有以下几点:Mongodb嵌入结构更新和搜索?,mongodb,mongodb-query,Mongodb,Mongodb Query,使用MongoDB存储nmap网络扫描的结果,并尝试找出构造数据的最佳方法 目前,我有以下几点: { "_id" : ObjectId("525f94097025166583e18eba"), "ip" : "127.0.0.1", "services" : [ { "port" : "22", "port_info" : [ { "
{
"_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" }}})
但我不知道如何找到所有主机,例如有“product”:“ssh”
尝试,但我得到一个语法错误
db.hosts.find({ ip : "127.0.0.1"}, { services.port_info : { $elemMatch : { product : "ssh" }}})
那么假设我想在“port_info”中添加另一个元素,比如
协议:tcp
我应该如何进行更新,比如说更新,ip:127.0.0.1,产品是ssh
services.port\u info
$elemMatch
$elemMatch
db.hosts.find({ ip : "127.0.0.1"}, { "services.port_info.product" : "ssh" });
如果要匹配阵列对象内的多个条件,例如“查找端口为9000且协议为UDP的所有条件”,则需要使用“$elemMatch
”。您的数据结构不支持这种情况。我不确定为什么port\u info
是一个对象数组(可能在不确定的情况下,一个端口可能属于两个不同的服务?)-如果它是一个对象,即使是$elemMatch
,也会受到支持
另外,请记住,这样的查询将始终返回整个对象