2016-04-14 11 views
2

Mongo Aggregation Frameworkを使用して、ドキュメント内の配列と別のユーザー定義の配列との間の交差を検出しようとしています。 正しい結果が得られず、配列の内部に配列があるため、私の推測はその通りです。サブ文書配列とユーザー定義配列の交点?

これは私のデータセットです。

マイドキュメント:

{ 
    "_id" : 1, 
    "pendingEntries" : [ 
     { 
      "entryID" : ObjectId("5701b4c3c6b126083332e65f"), 
      "tags" : [ 
       { 
        "tagKey" : "owner", 
        "tagValue" : "john" 
       }, 
       { 
        "tagKey" : "ErrorCode", 
        "tagValue" : "7001" 
       }, 
       { 
        "tagKey" : "ErrorDescription", 
        "tagValue" : "error123" 
       } 
      ], 
      "entryTime" : ISODate("2016-04-04T00:26:43.167Z") 
     } 
    ] 
}, 

/* 1 */ 
{ 
    "_id" : 2, 
    "pendingEntries" : [ 
     { 
      "entryID" : ObjectId("5701b4c3c6b126083332e65d"), 
      "tags" : [ 
       { 
        "tagKey" : "owner", 
        "tagValue" : "peter" 
       }, 
       { 
        "tagKey" : "ErrorCode", 
        "tagValue" : "6001" 
       }, 
       { 
        "tagKey" : "JIRA", 
        "tagValue" : "Oabc-123" 
       } 
      ], 
      "entryTime" : ISODate("2016-04-04T00:26:43.167Z") 
     } 
    ] 
}, 

/* 2 */ 
{ 
    "_id" : 3, 
    "pendingEntries" : [ 
     { 
      "entryID" : ObjectId("5701b4c3c6b126083332e65c"), 
      "tags" : [ 
       { 
        "tagKey" : "owner", 
        "tagValue" : "abc" 
       }, 
       { 
        "tagKey" : "ErrorCode", 
        "tagValue" : "6001" 
       }, 
       { 
        "tagKey" : "JIRA", 
        "tagValue" : "abc-123" 
       } 
      ], 
      "entryTime" : ISODate("2016-04-04T00:26:43.167Z") 
     } 
    ] 
} 

マイクエリ:

db.entrylike.aggregate(
    [ 
    { $project: { "pendingEntries.entryID": 1, "common": { $setIntersection: [ "$pendingEntries.tags", [{ "tagKey" : "ErrorCode", "tagValue" : "7001" }] ] } } } 
    ] 
) 

結果:

{ 
    "result" : [ 
     { 
      "_id" : 1, 
      "pendingEntries" : [ 
       { 
        "entryID" : ObjectId("5701b4c3c6b126083332e65f") 
       } 
      ], 
      "common" : [] 
     }, 
     { 
      "_id" : 2, 
      "pendingEntries" : [ 
       { 
        "entryID" : ObjectId("5701b4c3c6b126083332e65d") 
       } 
      ], 
      "common" : [] 
     }, 
     { 
      "_id" : 3, 
      "pendingEntries" : [ 
       { 
        "entryID" : ObjectId("5701b4c3c6b126083332e65c") 
       } 
      ], 
      "common" : [] 
     } 
    ], 
    "ok" : 1 
} 

私が空であることを第1の共通フィールドを期待しておりません。誰かが私に間違っていることを教えてもらえますか?または私が取ることができる任意の回避策。

私はmongodb 3.0.8を使用しています。私は、Mongodb 3.2が私のニーズを満たすいくつかの機能を提供できることを認識していますが、3.2アップグレードはすぐにパイプラインにはないので、可能ならMongo3.0を使用してこれを解決しようとしています。

私の目標は、tags配列をユーザー定義リストの共通要素で置き換えるか、共通要素で新しいフィールドを追加することです。私は私の事例の後にするつもりです。

答えて

2

「pendingEntries」配列とユーザー定義配列に共通の要素がないため、共通項目が空白の理由があります。あなたが本当に望むのは、 "tags"配列とユーザ定義配列に現れる要素を含む配列を返すことです。これを行うには、単に$map演算子を使用し、$setIntersection演算子を "pendingEntries"配列の各サブ文書 "tags"に適用します。

{ 
    "_id" : 1, 
    "common" : [ 
     { 
      "entryID" : ObjectId("5701b4c3c6b126083332e65f"), 
      "tags" : [ 
       { 
        "tagKey" : "ErrorCode", 
        "tagValue" : "7001" 
       } 
      ] 
     } 
    ] 
} 
{ 
    "_id" : 2, 
    "common" : [ 
     { 
      "entryID" : ObjectId("5701b4c3c6b126083332e65d"), 
      "tags" : [ ] 
     } 
    ] 
} 
{ 
    "_id" : 3, 
    "common" : [ 
     { 
      "entryID" : ObjectId("5701b4c3c6b126083332e65c"), 
      "tags" : [ ] 
     } 
    ] 
} 
+1

を、単に '$ setIntersection'内に直接単一要素の配列を記譜することは完全に罰金ですので、' $のliteral'はこのコンテキストでは必要ないはずです。返し

db.entrylike.aggregate([ { "$project": { "common": { "$map": { "input": "$pendingEntries", "as": "p", "in": { "entryID": "$$p.entryID", "tags": { "$setIntersection": [ "$$p.tags", { "$literal": [ { "tagKey" : "ErrorCode", "tagValue" : "7001" } ]} ] } } } } }} ]) 

。また、$ setIntersectionは、要素が「正確な」順序であり、 '[{" tagValue ":" 7001 "、" tagKey ":" ErrorCode "}]'表記はそうでないため、一致していなければなりません。ここでは、比較データまたは格納されたデータのどちらかがキーの順番ではありませんでした。もちろん、 '$ map'を使って要素にアクセスし、変更されたフォームを返す場合は、主なポイントです。それは述べたとおりです。 –

+0

@ NeeLunnまた、 '$ literal'は必要ではなく' $ literal'がなくても、* "FieldPath 'ErrorCode'が$で始まらない* – styvane

+0

あなたはタイプミスがあったはずです。 '' $ setIntersection ":[[" a "、" b "]、[" b "]]}}})'は単純な再現性があります場合。 –

関連する問題