Mongodb嵌入结构更新和搜索?

时间:2013-10-17 17:01:20

标签: mongodb mongodb-query

使用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”中添加另一个元素     protocol:tcp

我怎么做更新,我说更新的地方ip:127.0.0.1和产品是ssh?

1 个答案:

答案 0 :(得分:2)

  1. 语法错误是因为您必须在services.port_info
  2. 周围使用引号
  3. 但是,$elemMatch in nested fields is currently unsupported无论如何
  4. 幸运的是,您不需要$elemMatch来进行此类查询
  5. 这应该做:

    db.hosts.find({ ip : "127.0.0.1"}, { "services.port_info.product" : "ssh" });
    
    如果要匹配数组对象内的多个条件,则需要

    $elemMatch,例如“查找端口为9000且协议为UDP的所有端口”。这将不支持您的数据结构。我不确定为什么port_info是一个对象数组(可能是因为端口可能属于两个不同的服务的不确定的位置?) - 如果它是一个对象,即使支持$elemMatch也是如此

    另外,请记住,此类查询将始终返回整个对象。

相关问题