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" }}})

しかし、たとえば "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 の update のようなものを言う場合、更新を行うにはどうすればよいですか?

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がわかりません (ポートが 2 つの異なるサービスに属する可能性がある不確実な状況のためでしょうか?) - それが単一のオブジェクトである場合でも、$elemMatchサポートされます。

また、このようなクエリは常にオブジェクト全体を返すことに注意してください。

于 2013-10-17T21:26:05.910 に答える