1

내 문서 구조가 (만 2 단지 아이디어를 제공) :

/* 1 */ 
{ 
    "_id" : ObjectId("59edc58af33e9b5988b875fa"), 
    "Agent" : { 
     "Name" : "NomanAgent", 
     "Location" : "Lahore", 
     "AgentId" : 66, 
     "Suggestion" : [ 
      "Knowledge", 
      "Professionalisn" 
     ] 
    }, 
    "Rating" : 2, 
    "Status" : "Submitted" 
} 
/* 2 */ 
{ 
    "_id" : ObjectId("59edc58af33e9b5988b875fb"), 
    "Agent" : { 
     "Name" : "NomanAgent", 
     "Location" : "Lahore", 
     "AgentId" : 66, 
     "Suggestion" : [ 
      "Knowledge", 
      "Clarity" 
     ] 
    }, 
    "Rating" : 1, 
    "Status" : "Submitted" 
} 
/* 3 */ 
{ 
    "_id" : ObjectId("59edc58af33e9b5988b875fc"), 
    "Agent" : { 
     "Name" : "NomanAgent", 
     "Location" : "Lahore", 
     "AgentId" : 66, 
     "Reward" : "Thumb Up" 
    }, 
    "Rating" : 5, 
    "Status" : "Submitted" 
} 

다음은 기본적으로 설문 조사 응답, 그래서 에이전트 개체를 포함 할 수 중 제안 (나쁜 고객 리뷰의 경우) 또는 보상 (행복한 고객의 경우) 여기에서 나는 제안이있는 2 건의 문서와 1 건의 보상을 보여주고 있습니다. 쿼리 위

db.getCollection('_survey.response').aggregate([ 
    { 
     $group:{ 
      _id: "$Agent.Name", 
      Rating: {$avg: "$Rating"}, 
      Rewards: {$push: "$Agent.Reward"}, 
      Status: {$push : "$Status"} 
     } 
    }, 
    { 
     $unwind: "$Rewards" 
    }, 
    { 
     $group:{ 
      _id: { 
       Agent: "$_id", 
       Rating: "$Rating", 
       Rewards: "$Rewards" 
      }, 
      RewardCount:{$sum: 1}, 
      SurveyStatus: {$first: "$Status"} 

     } 
    }, 
    { 
     $group:{ 
      _id: "$_id.Agent", 
      Rewards: {$push:{Reward: "$_id.Rewards", Count: "$RewardCount"}}, 
      Rating: {$first: "$_id.Rating"}, 
      SurveyStatus: {$first: "$SurveyStatus"} 
     } 
    }, 
    { 
     $unwind: "$SurveyStatus" 
    }, 
    { 
     $group:{ 
      _id: { 
       Agent: "$_id", 
       Survey: "$SurveyStatus" 
      }, 
      StatusCount:{$sum : 1}, 
      Rating: {$first: "$Rating"}, 
      Rewards: {$first: "$Rewards"} 
     } 
    }, 
    { 
     $group:{ 
      _id: "$_id.Agent", 
      Status:{$push:{Status: "$_id.Survey", Count: "$StatusCount"}}, 
      Rewards: {$first: "$Rewards"}, 
      Rating: {$first: "$Rating"} 
     } 
    }, 
    { 
     $project:{ 
      _id: 0, 
      Agent: "$_id", 
      Rating: { 
       $multiply:[ 
        {$divide:["$Rating",5]}, 
        100 
       ] 
      }, 
      Status: 1, 
      Rewards: 1 
     } 
    } 
]); 

가 보상에 완벽하게 잘 작동

나는 아래에 주어진 보상에 대한 쿼리를 만든

은, 내가 제안 정확히 같은 일을 원하고 그것의, 가능하면 나는 행복 할 것 동일한 검색어에서 추천 검색어 조정 (추천 검색어를 별도로 만들 수도 있음) 위의 주어진 쿼리의

응답 :

/* 1 */ 
{ 
    "Status" : [ 
     { 
      "Status" : "Submitted", 
      "Count" : 2.0 
     }, 
     { 
      "Status" : "Pending", 
      "Count" : 1.0 
     }, 
     { 
      "Status" : "Opened", 
      "Count" : 2.0 
     } 
    ], 
    "Rewards" : [ 
     { 
      "Reward" : "Thumb Up", 
      "Count" : 1.0 
     }, 
     { 
      "Reward" : "Thank You", 
      "Count" : 2.0 
     } 
    ], 
    "Agent" : "GhazanferAgent", 
    "Rating" : 68.0 
} 

/* 2 */ 
{ 
    "Status" : [ 
     { 
      "Status" : "Opened", 
      "Count" : 2.0 
     }, 
     { 
      "Status" : "Viewed", 
      "Count" : 2.0 
     }, 
     { 
      "Status" : "Pending", 
      "Count" : 3.0 
     } 
    ], 
    "Rewards" : [ 
     { 
      "Reward" : "Gift", 
      "Count" : 1.0 
     }, 
     { 
      "Reward" : "Thumb Up", 
      "Count" : 3.0 
     }, 
     { 
      "Reward" : "Thank You", 
      "Count" : 1.0 
     } 
    ], 
    "Agent" : "NomanAgent", 
    "Rating" : 60.0 
} 

지금까지 시도, 나는 두 가지 방법을 생각하지만, 그들 각각의 문제를 찾을 무엇

먼저 (평균 등급을 찾아 배열의 푸시 상태 및 제안) :

db.getCollection("_survey.response").aggregate([ 
    { 
     $match: 
     { 
      $and:[ 
       { 
        "Agent.Suggestion":{ 
         $exists: true 
        } 
       },  
       { 
        Rating: {$lte: 3} 
       } 
      ] 

     } 
    }, 
    { 
     $group:{ 
      _id: { 
       AgentName: "$Agent.Name", 
       AgentId: "$Agent.AgentId", 
       Location: "$Agent.Location" 
      }, 
      Rating: {$avg: "$Rating"}, 
      Status: {$push : "$Status"}, 
      Suggestions: {$push: "$Agent.Suggestion"} 
     } 
    } 
]); 

문제는이 아프로에 직면 ach는 프로젝션의 제안 사항이 상담원이 고객 응답에서 제안을 얻는 횟수에 따라 동적 크기의 배열 배열 (처음에는 배열이었습니다)이 될 것입니다. 따라서 문제는 동적 크기가 2 차원 배열 인에 $ unwind를 적용하는 것입니다.

둘째,이 방식을 사용

db.getCollection("_survey.response").aggregate([ 
    { 
     $match: 
     { 
      $and:[ 
       { 
        "Agent.Suggestion":{ 
         $exists: true 
        } 
       },  
       { 
        Rating: {$lte: 3} 
       } 
      ] 

     } 
    }, 
    { 
     $unwind: "$Agent.Suggestion" 
    }, 
    { 
     $group: { 
      _id:{ 
       AgentName: "$Agent.Name", 
       AgentId: "$Agent.AgentId", 
       Suggestion: "$Agent.Suggestion", 
       Location: "$Agent.Location" 
      }, 
      Status: {$push: "$Status"}, 
      Rating: {$avg: "$Rating"}, 
      Count: {$sum: 1} 
     } 
    } 
]); 

문제점 $이고 ($ 그와 같은 1 단 제안 긴장 1 차원 어레이 동적 크기의 2 차원 배열의 문제를 긴장 $을 피하기 위해) 제안 배열을 풀면 해당 에이전트와의 모든 제안이 병합되므로 (원래 응답과 비교하여) 문서 수가 증가하므로 이 그룹화를 기준으로 각 상담원의 평균 등급에 대한 올바른 값을 찾을 수 없습니다 에이 상태가 동일하게 발생할 것입니다. 왜냐하면 내가 에이전트로 그룹화 할 때만이 두 필드를 올바르게 찾을 수 있기 때문입니다. 여기에 제안과 함께 에이전트와 그룹화 중입니다.,

내가 제안 검색어에 대해 정확히 동일한 응답을 원할 경우 응답의 보상 객체 만 제안을 대체합니다 (또는 제안 객체를받을 수 있다면 좋을 것입니다. 동일한 응답)

조사 상태 할 수있는 일, 오픈, 볼, 제출 등 계류중인

출력 설명 : 내가 원하는

카운트와 제안() %의 형태로 개수와 상태() 및 평가 (나는 이미하고있다) 당신이 출력에서 ​​볼 수있는 것처럼 각 에이전트에 대해 위에 언급했듯이.

미리 감사드립니다.

+0

, 첫 번째 방법을 사용하여, 두 번 연속 나를 위해 속임수를 썼는지 긴장을 풀고. 제안에 대해 똑같이하는 것을 멈추게하는 것은 무엇입니까? –

+0

Rewards는 단순히 키 값 쌍입니다. 제안은 배열입니다.이 배열은 내가 붙어있는 곳이며, 제안의 데이터를 평평하게하기 위해 풀면 평점 (프로젝트 단계에서 % 형식으로 계산 됨)이 엉망입니다. –

+0

내가 틀렸을 수도 있습니다. 나는이 제안을 몇 가지 방법으로 변환하려고합니다. –

답변

0

사용 $ 당신은 보상을위한 매우 정교한 파이프 라인을 만들 수 있습니다

db.getCollection("_survey.response").aggregate([ 
    { 
     $match: 
     { 
      $and:[ 
       { 
        "Agent.Suggestion":{ 
         $exists: true 
        } 
       },  
       { 
        Rating: {$lte: 3} 
       } 
      ] 

     } 
    }, 
    { 
     $group:{ 
      _id: { 
       AgentName: "$Agent.Name", 
       AgentId: "$Agent.AgentId", 
       Location: "$Agent.Location" 
      }, 
      Rating: {$avg: "$Rating"}, 
      Status: {$push : "$Status"}, 
      Suggestions: {$push: "$Agent.Suggestion"} 
     } 
    }, 
    { 
     $unwind: "$Suggestions" 
    }, 
    { 
     $unwind: "$Suggestions" 
    }, 
    { 
     $group: { 
      _id: { 
       Suggestions: "$Suggestions", 
       AgentName: "$_id.AgentName", 
       AgentId: "$_id.AgentId", 
       Location: "$_id.Location" 
      }, 
      SuggestionCount: {$sum: 1}, 
      Rating: {$first: "$Rating"}, 
      Status: {$first: "$Status"} 
     } 
    }, 
    { 
     $group: { 
      _id:{ 
       AgentName: "$_id.AgentName", 
       AgentId: "$_id.AgentId", 
       Location: "$_id.Location" 
      }, 
      Suggestions: {$push:{Sugestion: "$_id.Suggestions", Count: "$SuggestionCount"}}, 
      TotalSuggestions: {$sum: "$SuggestionCount"}, 
      Rating: {$first: "$Rating"}, 
      Status: {$first: "$Status"} 
     } 

    }, 
    { 
     $unwind: "$Status" 
    }, 
    { 
     $group:{ 
      _id: { 
       AgentName: "$_id.AgentName", 
       AgentId: "$_id.AgentId", 
       Location: "$_id.Location", 
       Status: "$Status" 
      }, 
      StatusCount:{$sum : 1}, 
      Rating: {$first: "$Rating"}, 
      Suggestions: {$first: "$Suggestions"}, 
      TotalSuggestions: {$first: "$TotalSuggestions"} 
     } 
    }, 
    { 
     $group:{ 
      _id: { 
       AgentName: "$_id.AgentName", 
       AgentId: "$_id.AgentId", 
       Location: "$_id.Location" 
      }, 
      Status:{$push:{Status: "$_id.Status", Count: "$StatusCount"}}, 
      TotalStatus: {$sum: "$StatusCount"}, 
      Suggestions: {$first: "$Suggestions"}, 
      TotalSuggestions: {$first: "$TotalSuggestions"}, 
      Rating: {$first: "$Rating"} 
     } 
    }, 
    { 
     $project: { 
      _id: 0, 
      AgentName: "$_id.AgentName", 
      AgentId: "$_id.AgentId", 
      Location: "$_id.Location", 
      Status: 1, 
      TotalStatus: 1, 
      Suggestions: 1, 
      TotalSuggestions: 1, 
      Performance: { 
       $concat: [ 
        { 
         $substr: [ 
          { 
           $multiply:[ 
            {$divide:["$Rating",5]}, 
            100 
           ] 

          }, 0, 4 
         ] 
        },"%" 
       ] 
      } 
     } 
    } 
]);