2016-09-29 72 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

雅它工作。谢谢:) –