2016-08-17 2 views
0

Hier ist ein Auszug aus einem nmap-Scan, die ich von XML-Daten in JSON-Format konvertiert haben:MongoDB Abfrage Zurückkehren mehr als für nmap Daten erwartet

{ 
    "nmaprun": { 
     "@scanner": "nmap", 
     "@args": "nmap -T4 -F -sV -O -n --exclude 192.168.10.1 -oX nmap-00:90:a9:0e:87:21.xml 192.168.10.1/24", 
     "@start": "1470812419", 
     "@startstr": "Wed Aug 10 00:00:19 2016", 
     "@version": "7.12", 
     "@xmloutputversion": "1.04", 
     "scaninfo": { 
      "@type": "syn", 
      "@protocol": "tcp", 
      "@numservices": "100", 
     "host": { 
      "@starttime": "1470812419", 
      "@endtime": "1470812462", 
      "status": { 
       "@state": "up", 
       "@reason": "arp-response", 
       "@reason_ttl": "0" 
      }, 
      "address": [ 
       { 
        "@addr": "192.168.1.123", 
        "@addrtype": "ipv4" 
       }, 
       { 
        "@addr": "18:B4:30:4C:94:1B", 
        "@addrtype": "mac" 
       } 
      ] 
} 

Die Rückkehr der folgenden Abfrage, das Projekt zu suchen versucht und MAC-Adresse + Adresstyp enthält zusätzliche Felder

db.nmaps.find({"[email protected]":"18:B4:30:4C:94:1B","[email protected]":"mac"},{"[email protected]":1, "[email protected]":1}).pretty() 

Gibt zusätzliche Felder zurück, die nicht mit den Parametern der Abfrage übereinstimmen. Insbesondere werden die IPv4- und IP-Adresse auch zurückgegeben. Nicht sicher, warum das passiert.

Return of query:

{ 
    "_id" : ObjectId("57acb4c35e18500dc5f4d7d8"), 
    "nmaprun" : { 
    "host" : { 
     "address" : [ 
     { 
      "@addr" : "", 
      "@addrtype" : "ipv4" 
     }, 
     { 
      "@addr" : "18:B4:30:4C:94:1B", 
      "@addrtype" : "mac" 
     } 
     ] 
    } 
    } 
} 

Antwort

1

Der Grund, Sie werden immer beide Array-Elemente ist, dass das gesamte Dokument eine Übereinstimmung zu den Suchkriterien in Betracht gezogen wird Ihnen zur Verfügung gestellt haben, und es gibt nichts in der Projektion zu begrenzen die Ergebnisse nur für das übereinstimmende Array-Element.

Eine einfache Art und Weise zu ändern, was Sie die erwarteten Ergebnisse bekommen haben, ist die Positions $ Operator (https://docs.mongodb.com/manual/reference/operator/projection/positional/) in der Projektion zu verwenden:

db.nmaps.find({"[email protected]":"18:B4:30:4C:94:1B","[email protected]":"mac"},{"nmaprun.host.address.$":1}).pretty() 

Eine andere Möglichkeit, es zu tun Aggregation verwenden würde:

db.nmaps.aggregate([ 
    { 
     $unwind: "$nmaprun.host.address" 
    }, 
    { 
     $match:{ 
      "[email protected]":"18:B4:30:4C:94:1B", 
      "[email protected]":"mac" 
     } 
    }, 
    { 
     $project:{ 
      "[email protected]":1, 
      "[email protected]":1 
     } 
    } 
])