2016-06-13 7 views
0

私はMongoDBデータベースを照会するためのpythonスクリプトを書いています。私は、連想配列に格納されているデータの照会、フィルタリング、および解析を支援する必要があります。MongoDB連想配列の照会

要件:

  • クエリホスト名、最後に見た日、ステータス、およびIPv4アドレス(他のフィールドは必要ありません)

  • をインポートすることができ、「フラット」JSON形式にデータを解析ここでは、リレーショナルデータベースに

は、私たちが照会されているデータのデータ構造です:

ここで
[{"hostnames": [{"type": "ABC", "name": "example.hostname.com"}], "vendor": {"vendor_name": "apple"}, "last_seen": {"$date": 1461123503979}, "status": {"state": "up", "reason": "echo-reply"}, "addresses": {"ipv4": "192.168.1.1"}}] 

は、私はそれがフラットなリレーショナルデータベースにインポートすることができるようにしたいシンプルなデータ構造である:ここで

[{"name": "example.hostname.com", "vendor": "apple", "$date": 1461934503972, "state": "up", "ipv4": "192.168.1.1"}] 

は、私が始めているコードです。私は集計を使用してフィールドのエイリアスを作成しています。

データを必要な形式で取得するために、連想配列をまだトラバースする必要があります。

client = MongoClient(mongo_uri) 

db = client[mongo_db] 

computers = db['computer'].aggregate([ 

#Aggregate - RDBMS equivalent to Alias select x as y 
#Rename fields to match destination names 
     {"$project": { 
       "_id":0, 
       "u_id":"$id", 
       "u_status": "$status", 
       "u_vendor":"$vendor", 
       "u_addresses": "$addresses", 
       "u_hostnames": "$hostnames", 
       "u_last_seen": "$last_seen" 
     }} 
    ]) 
+0

"hostnames"は1つの要素リストですか? – styvane

+0

これは、コレクション内の単一のドキュメントの例です。 – pengz

+0

ありがとうございました。もう1つの質問は、 "u_last_seen"日付が返されていないことです。 "date": "$ last_seen.date" 日付フィールドがエンコードされています。次に、データベースの日付フィールドの例を示します。 "last_seen":ISODate( "2016-04-29T14:06:17.441Z") この値を返すには他に何が必要ですか?どうもありがとう。 – pengz

答えて

1

あなたは、「ホスト名」の配列を$unwindたり、サーバーのバージョンに応じて、配列の要素の「名前」フィールドにアクセスするために$arrayElemAt演算子を使用する必要があります。

最適な方法は、あなたが、その後$let演算子を使用して変数に設定し、ドット表記で、「名前」フィールドにアクセスする配列の要素を返すために$project段階で$arrayElemAt演算子を使用してのMongoDB 3.2です。

computers.aggregate([ 
    {"$project": { 
     "name": { 
     "$let": { 
      "vars": {"host": {"$arrayElemAt": ["$hostnames", 0]}}, 
      "in": "$$host.name"} 
     }, 
     "vendor": "$vendor.vendor_name", 
     "date": "$last_seen.date", 
     "state": "$status.state", 
     "ipv4": "$addresses.ipv4", 
     "_id": 0 
    }} 
]) 

は、古いバージョンでは、あなたの文書をINGの$project$unwind演算子を使用して配列を分解する必要があります。

computers.aggregate([ 
    {"$unwind": "$hostnames"}, 
    {"$project": { 
     "name": "$hostnames.name", 
     "vendor": "$vendor.vendor_name", 
     "date": "$last_seen.date", 
     "state": "$status.state", 
     "ipv4": "$addresses.ipv4", 
     "_id": 0 
    }} 
])