Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb嵌入结构更新和搜索?_Mongodb_Mongodb Query - Fatal编程技术网

Mongodb嵌入结构更新和搜索?

Mongodb嵌入结构更新和搜索?,mongodb,mongodb-query,Mongodb,Mongodb Query,使用MongoDB存储nmap网络扫描的结果,并尝试找出构造数据的最佳方法 目前,我有以下几点: { "_id" : ObjectId("525f94097025166583e18eba"), "ip" : "127.0.0.1", "services" : [ { "port" : "22", "port_info" : [ { "

使用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" }}})
但我不知道如何找到所有主机,例如有“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
    ,也会受到支持

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