2

考虑一下 SQL 中的这段代码,它根据工资范围形成组:

;With TableWithComputedColumn as (
select
computedcolumn =
Case
when Salary<30000 then 'Under 30K'
when Salary>30000 and Salary<60000 then '30K-60K'
else 'Above 60K'
end from Tbl_UserMaster
)
select computedcolumn, COUNT(*)
from TableWithComputedColumn group by computedcolumn

我想在 Mongo 中执行此操作。我的猜测是 CTE 部分将要求我首先输出{computed column}到一个临时集合,然后$group对该集合执行一个操作。另一种方式(也是我更喜欢的方式)可能是使用作为聚合管道中的第一个流$project进行投影{computed column},然后执行$group.

db.UM.aggregate( {$project: { "computed_column": { //something with $cond}} },
{$group: {_id: {Salary_Slab:"$computed_column"}, count: {$sum:1}}}
);

还请通过我之前问过的类似问题:

MongoDB 中的条件 $sum

它基本上给了我一个旋转的输出。在这种情况下,我需要非透视输出。为了比较两者,另一个问题的答案将创建三列:{Under 30K, 30K-60K, Above 60K} 单行计数,而我需要三行来表示 Under 30K、30K-60K 和 Above 60K在一列中,它们各自的计数在第二列中。

4

1 回答 1

3

你在正确的轨道上。在这种情况下,您需要$cond像这样嵌套运算符:

db.UM.aggregate(
    { $project: {
        computed_column: {$cond: [{$gt: ['$Salary', 30000]},
            {$cond: [{$gt: ['$Salary', 60000]}, 'Above 60K', '30K-60K']},
            'Under 30K']}
    }},
    { $group: {_id: {Salary_Slab: '$computed_column'}, count: {$sum: 1}}})

结果:

[ { _id: { Salary_Slab: 'Above 60K' }, count: 3 },
  { _id: { Salary_Slab: '30K-60K' }, count: 1 },
  { _id: { Salary_Slab: 'Under 30K' }, count: 2 } ]
于 2013-01-08T13:47:03.150 回答