2016-09-29 6 views
1

$やqueryを使ってmongodbの小さな問題に悩まされましたが、私は以下のスキーマを持つドキュメントを持っています。 ロールskill_setキーを持ち、各ロールにはいくつかのスキルセットが関連付けられています。

[ 
{ 
    "skill_set" : [ 
     { 
      "skill_name" : "Project Planning" 
     }, 
     { 
      "skill_name" : "Delivery Management" 
     }, 
     { 
      "skill_name" : "Resource Management" 
     }, 
     { 
      "skill_name" : "Stakeholder Management" 
     }, 
     { 
      "skill_name" : "Agile Project Management" 
     }, 
     { 
      "skill_name" : "Change Management" 
     } 
    ], 
    "role" : "Project Manager" 
}, 
{ 
    "skill_set" : [ 
     { 
      "skill_name" : "Project Planning" 
     }, 
     { 
      "skill_name" : "Delivery Management" 
     }, 
     { 
      "skill_name" : "Resource Management" 
     }, 
     { 
      "skill_name" : "Stakeholder Management" 
     }, 
     { 
      "skill_name" : "Agile Project Management" 
     }, 
     { 
      "skill_name" : "Change Management" 
     }, 
     { 
      "skill_name" : "Financial Management" 
     }, 
     { 
      "skill_name" : "Sales, Marketing and Customer Service " 
     }, 
     { 
      "skill_name" : "Strategic Input" 
     } 
    ], 
    "role" : "Sr Project Manager" 
}, 
{ 
    "skill_set" : [ 
     { 
      "skill_name" : "Project Planning" 
     }, 
     { 
      "skill_name" : "Delivery Management" 
     }, 
     { 
      "skill_name" : "Resource Management" 
     }, 
     { 
      "skill_name" : "Stakeholder Management" 
     }, 
     { 
      "skill_name" : "Agile Project Management" 
     }, 
     { 
      "skill_name" : "Change Management" 
     }, 
     { 
      "skill_name" : "Financial Management" 
     }, 
     { 
      "skill_name" : "Sales, Marketing and Customer Service " 
     }, 
     { 
      "skill_name" : "Strategic Input" 
     } 
    ], 
    "role" : "Delivery Manager" 
}, 
{ 
    "skill_set" : [ 
     { 
      "skill_name" : "Test Planning" 
     }, 
     { 
      "skill_name" : "Technlogy Expertise" 
     }, 
     { 
      "skill_name" : "Team Player" 
     }, 
     { 
      "skill_name" : "Communication" 
     }, 
     { 
      "skill_name" : "Design and Architecture" 
     }, 
     { 
      "skill_name" : "Requirement Understanding" 
     }, 
     { 
      "skill_name" : "Task Management" 
     } 
    ], 
    "role" : "Tester" 
} 
] 

私は、クエリを使用してフェッチすることができる午前役割のマッチングskill_set、との文書を検索したいです。出力において

{"$or":[{"skill_set.skill_name":"Project Planning"},{"skill_set.skill_name":"Strategic Input"},{"skill_set.skill_name":"Delivery Management"}]},{"_id":0} 

照会の出力

[ 
{ 
    "skill_set" : [ 
     { 
      "skill_name" : "Project Planning" 
     }, 
     { 
      "skill_name" : "Delivery Management" 
     }, 
     { 
      "skill_name" : "Resource Management" 
     }, 
     { 
      "skill_name" : "Stakeholder Management" 
     }, 
     { 
      "skill_name" : "Agile Project Management" 
     }, 
     { 
      "skill_name" : "Change Management" 
     } 
    ], 
    "role" : "Project Manager" 
}, 
{ 
    "skill_set" : [ 
     { 
      "skill_name" : "Project Planning" 
     }, 
     { 
      "skill_name" : "Delivery Management" 
     }, 
     { 
      "skill_name" : "Resource Management" 
     }, 
     { 
      "skill_name" : "Stakeholder Management" 
     }, 
     { 
      "skill_name" : "Agile Project Management" 
     }, 
     { 
      "skill_name" : "Change Management" 
     }, 
     { 
      "skill_name" : "Financial Management" 
     }, 
     { 
      "skill_name" : "Sales, Marketing and Customer Service " 
     }, 
     { 
      "skill_name" : "Strategic Input" 
     } 
    ], 
    "role" : "Sr Project Manager" 
}, 
{ 
    "skill_set" : [ 
     { 
      "skill_name" : "Project Planning" 
     }, 
     { 
      "skill_name" : "Delivery Management" 
     }, 
     { 
      "skill_name" : "Resource Management" 
     }, 
     { 
      "skill_name" : "Stakeholder Management" 
     }, 
     { 
      "skill_name" : "Agile Project Management" 
     }, 
     { 
      "skill_name" : "Change Management" 
     }, 
     { 
      "skill_name" : "Financial Management" 
     }, 
     { 
      "skill_name" : "Sales, Marketing and Customer Service " 
     }, 
     { 
      "skill_name" : "Strategic Input" 
     } 
    ], 
    "role" : "Delivery Manager" 
} 
] 

は3~4アウトロールがフェッチされ、はっきりと見えます。これに加えて、ロールに一致するスキルセットのカウントが必要です。

私はProject PlanningまたはDelivery ManagementまたはStrategic Inputでロールを検索していますが、ロールのProject Managerにskill_match_count = 2が必要です。スキルセットに2つの一致があります。あなたがする必要がどのような

[ 
{ 
    "role" : "Project Manager", 
    "skill_match_count" : 2 
}, 
{ 
    "role" : "Sr Project Manager", 
    "skill_match_count" : 3 
}, 
{ 
    "role" : "Delivery Manager", 
    "skill_match_count" : 3 
} 
] 
+0

例出力がサンプルドキュメントと一致しません。例えば、 'Project Manager'には6つのスキルがあり、出力には2が表示されます。だから間違いはありますか?私は何を数えているのか本当に分かりません。 – TomG

+0

@tomこのカウントは、上記のクエリマッチから与えられた「プロジェクトマネージャー」ロール2スキルのスキルのマッチングのためだけです。私は私の質問を明確にしたいと思います。 –

+0

あなたはmongo 'aggregation'機能を使ってそれに近づけることができると思います。試してみてください。 – gzc

答えて

1

、あなたのフィルタ配列の$sizeをご$or条件でskill_set配列を$filter、その後$projectすることです:

db.roles.aggregate([ 
    { 
     $project: { 
      role: 1, 
      filtered_skill_set: { 
       $filter: { 
        input: "$skill_set", 
        as: "skill", 
        cond: { 
         $or: [ 
          { $eq: ["$$skill.skill_name", "Project Planning"] }, 
          { $eq: ["$$skill.skill_name", "Strategic Input"] }, 
          { $eq: ["$$skill.skill_name", "Delivery Management"] } 
         ] 
        } 
       } 
      } 
     } 
    }, 
    { 
     $project: { 
      role: 1, 
      skill_match_count: { 
       $size: "$filtered_skill_set" 
      } 
     } 
    } 
]) 

これは役割を含め、あなたが期待する出力を発生しますskill_match_countでは0となります。それらを除外したい場合は、別の$matchパイプラインステージを末尾に追加することができます。

{ 
    $match: { 
     skill_match_count: { 
      $gt: 0 
     } 
    } 
} 
+0

私はこれを試していただきありがとうございます。 :) –

+0

すべてのニュース?承認を待って:D – TomG

+0

それは動作します。ありがとう:) –

関連する問題