マイドキュメントの構造は、(わずか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を適用しています。
セカンド($動的サイズの2次元アレイに問題をリラックス$を避けるために、その1次元アレイ ように、第1段目の提案をアンワインド)このアプローチを使用して
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}
}
}
]);
問題が$あります提案配列を解除すると、それぞれのエージェントですべての提案が平準化されます(元の応答と比較して)の数が増えるため、このグループに基づいて各エージェントの平均レーティングの正しい値を見つけることができなくなりますa同じことがステータスが発生します(私はこれらの2つのフィールドがエージェントによってグループ化されている場合にのみ正しく見つけることができるためです)。ここで私はエージェントと共にグループ分けしています)
私はちょうどSuggestionsクエリの応答と同じですが、応答のRewardsオブジェクトのみがSuggestionsを置き換えます(または、Suggestionsオブジェクトを%の形で
私はカウントの提案を()したい、カウントを持つ状態()と評価(:同じレスポンス)
調査ステータスが保留中であることができる、オープン、閲覧、投稿など
出力説明私はすでに行っています)あなたが出力で見ることができるようにエージェントのそれぞれについて上記の通り。
ありがとうございます!2回連続しておくつろぎ$を使用して
をトリックをしました。あなたは提案のために同じことをやりますか? –
報酬は単純にキーの値のペアですが、提案は配列ですが、これは私が立ち往生した場所で、提案のデータを平坦化するために巻き戻すときにRating(プロジェクト段階では%formで計算されます) –
私は間違っているかもしれない、私はちょうど提案のためにこのクエリを変換したい。 –