2016-07-08 19 views
1

私はPythonスクリプトを使用してMongoDBコレクションを照会しています。このコレクションには、さまざまな構造の埋め込みドキュメントが含まれています。MongoDB 2.6のpreserveNullAndEmptyArraysの回避策

私はいくつかのドキュメントに含まれている配列を単純に "$ unwind"しようとしています。ただし、配列はすべての文書にありません。

つまり、フィールドを含むドキュメントのみが返され、それ以外は無視されます。私はPyongong 2.6を使用していますので、documentationに記載されているようにpreserveNullAndEmptyArraysを使用することはできません。MongoDB 3.2の新機能ですので、

がありますか? "フィールドパスが存在する場合は、元に戻す"の行に沿って何か。

問題のドキュメントとコードの構造については、この個別のドキュメントで詳細に説明していますが、先に質問したrelated questionです。

ISSUE:

私は$hostnames.nameの値を "$ほどく" しようとしています。ただし、パスがすべてのドキュメントに存在しないため、いくつかの無視されたドキュメントが作成されます。 $ホスト名

{ 
    "_id" : "192.168.2.1", 
    "addresses" : { 
     "ipv4" : "192.168.2.1" 
    }, 
    "hostname" : "helloworld.com", 

} 

スクリプト

cmp = db['computers'].aggregate([ 
    {"$project": { 
     "u_hostname": { 
      "$ifNull": [ 
       "$hostnames.name", 
       { "$map": { 
        "input": {"$literal": ["A"]}, 
        "as": "el", 
        "in": "$hostname" 
       }} 
      ] 
     }, 
     "_id": 0, 
     "u_ipv4": "$addresses.ipv4" 
    }}, 
    {"$unwind": "$u_hostname"} 
]) 
として保存$ hostnames.name

{ 
    "_id" : "192.168.1.1", 
    "addresses" : { 
     "ipv4" : "192.168.1.1" 
    }, 
    "hostnames" : [ 
     { 
      "type" : "PTR", 
      "name" : "example.hostname.com" 
     } 
    ] 
} 

構造2ホスト名として保存

構造1つのホスト名

「ホスト名」の空の配列を持つすべてのドキュメントがありません。

これはまだ失われているドキュメントの構造です。

構造3

{ 
    "_id" : "192.168.1.1", 
    "addresses" : { "ipv4" : "192.168.1.1" }, 
    "hostnames" : [], } 
} 

答えて

1

我々はまだ$ifNullオペレータと一緒に遊んで配列フィールドが欠落しているすべての文書を保存し、新たに計算されたフィールドに値を割り当てるために論理$cond ition処理を使用することができます。

ここでの条件は$eqです。フィールドが[None]の場合はTrueを返し、条件式がfalseの場合はFalseを返します。

cmp = db['computers'].aggregate(
    [ 
     {"$project":{ 
      "u_ipv4": "$addresses.ipv4", 
      "u_hostname": { 
       "$let": { 
        "vars": { 
         "hostnameName": { 
          "$cond": [ 
           {"$eq": ["$hostnames", []]}, 
           [None], 
           {"$ifNull": ["$hostnames.name", [None]]} 
          ] 
         }, 
         "hostname": {"$ifNull": ["$hostname", None]} 
        }, 
        "in": { 
         "$cond": [ 
          {"$eq": ["$$hostnameName", [None]]}, 
          {"$map": { 
           "input": {"$literal": [None]}, 
           "as": "el", 
           "in": "$$hostname" 
          }}, 
          "$$hostnameName" 
         ] 
        } 
       } 
      } 
     }},   
     { "$unwind": "$u_hostname" } 
    ] 
)