2017-06-08 11 views
0

私は、グループ集約で$ pushを使用してminSalaryを持つデータをプッシュしようとしています。mongodbの集約とプッシュのグループ

問合せ:

db.users.aggregate([ 
    { $match: { experience: { $gte:3, $lte:10} } }, 
    { $group: { _id: {totalExperience:"$experience"}, "count": {$sum:1},"minSalary": {$min:"$expected_salary"}, "minUsers": {$push:"$_id"}, "maxSalary": {$max:"$expected_salary"} } },  
    { $sort: { '_id.totalExperience': -1 } }  
]) 

結果

{ 
    "_id" : { 
     "totalExperience" : 9 
    }, 
    "count" : 549.0, 
    "minSalaryCount" : 120000, 
    "maxSalary" : 180000 
} 

はまた、私は次のような結果に

{ 
    "_id" : { 
     "totalExperience" : 9 
    }, 
    "count" : 549.0, 
    "minSalaryCount" : 120000, 
    "maxSalary" : 180000, 
    "minSalaryUsers":[ 
     ObjectId('5355345345sdrrw234234'), 
     ObjectId('5355345345sdeee234234'), 
     ObjectId('5355345345sdertw234234') 
    ] 
} 

を期待していますありがとうございました。

+0

あなたは分給与とユーザーIDをmap' '$上のユーザ給与配列filter' $'への$ project'段階 '続く彼らの給与と一緒にユーザーIDをプッシュするために、' $のgroup'を変更する必要があります。 – Veeram

+0

@Veeramこれのサンプルを教えていただけますか? – azhagu

答えて

0

3.2バージョン以降では、以下の集約パイプラインを使用できます。

以下のクエリは、minSalary$mapユーザIDに$filterusersSalariesアレイに$projectステージが続く$group段階で給与と一緒にユーザーIDを蓄積するusersSalariesを含みます。

db.users.aggregate([ 
    { $match: { experience: { $gte:3, $lte:10} } }, 
    { $group: { 
     _id: {totalExperience:"$experience"}, 
     count: {$sum:1}, 
     minSalary: {$min:"$expected_salary"}, 
     usersSalaries: {$push:{user:"$_id", salary:"$expected_salary"}}, 
     maxSalary: {$max:"$expected_salary"} } }, 
    { $sort: { '_id.totalExperience': -1 } }, 
    { $project: { 
     count:1, 
     minSalary:1, 
     maxSalary:1, 
     minSalaryUsers:{ 
      $map: { 
       input: { 
        $filter: { 
         input: "$usersSalaries", 
         as: "userf", 
         cond: { 
          $eq: ["$$userf.salary", "$minSalary"] 
         } 
        } 
       }, 
       as: "userm", 
       in: "$$userm.user" 
      } 
     }, 
     maxSalaryUsers:{ 
      $map: { 
       input: { 
        $filter: { 
         input: "$usersSalaries", 
         as: userf, 
         cond: { 
          $eq: ["$$userf.salary", "$maxSalary"] 
         } 
        } 
       }, 
       as: userm, 
       in: "$$userm.user" 
      } 
     } 
     } 
    } 
])