2016-09-29 70 views
1

我在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個角色被取出。除此之外,我希望技能組匹配角色.ie。

在給定的查詢我在尋找項目規劃或交付管理或戰略投入角色,我想爲角色項目經理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

示例輸出與示例文檔不匹配。例如,「項目經理」有6項技能,在你的輸出中顯示2.所以是錯誤的?我真的不明白你在計算什麼。 – TomG

+0

@tom此計數僅用於匹配技能,即針對來自給定上述查詢匹配的「項目管理員」角色2技能。我希望我清楚我的問題。 –

+0

我想你可以通過使用mongo'aggregation'功能來處理它。請嘗試一下。 – gzc

回答

1

你需要做的,就是$filterskill_set陣列與$or條件,然後$project$size您的過濾數組:

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

雅它工作。謝謝:) –