MongoDB - MySQL SUM(CASE WHEN)等价?

时间:2012-01-20 17:57:22

标签: mongodb sum

我试图用Mongo做一些测试,我已经想到一些比较简单的MySQL查询了。

我的查询有点复杂,我需要帮助......

SELECT DISTINCT dims_user,
    COUNT(DISTINCT asset_name) AS asset_count,
    COUNT(DISTINCT system_name) AS station_count,
    SUM(CASE WHEN details ='viewed' then 1 Else 0 end) AS viewed_count,
    SUM(CASE WHEN details Like 'Viewed Web%' then 1 Else 0 end) AS Web_count,
    SUM(CASE WHEN details = 'ThumbView' then 1 Else 0 end) AS ThumbView_count,
    SUM(CASE WHEN details Like 'Exported%' then 1 Else 0 end) AS Exported_count,
    SUM(CASE WHEN details Like '%Print%' then 1 Else 0 end) AS Printed_count
FROM asset_log GROUP BY dims_user;

3 个答案:

答案 0 :(得分:1)

我同意Rudu的观点,因为您应该尝试将详细信息分解为mongo文档的密钥。

文档可能包含如下对象:

details:
{
  viewed: true
  thumb_view: true
  web_viewed: false
  exported: true
  ...
}

如果不重构数据,查询将需要无法使用MongoDB的索引功能的非root的正则表达式。

但是,无论您是否决定这样做,您都会想要使用map reduce。您可以在地图中发出包含细节的项目(通过使用正则表达式处理它们或者只是以重组形式发出键),并在reduce阶段对它们求和。

您可以在docs

中详细了解相关信息

答案 1 :(得分:1)

查看此链接,可能有所帮助:

http://www.kchodorow.com/blog/2011/12/09/sql-to-mongodb-an-updated-mapping/

它解释了如何分解SQL CASE WHEN语句并用新的聚合管道语法替换每个SQL。以下是您的陈述中第一种情况的示例:

{
  $project : {
    'viewed': {
        '$cond': [ 
            {'$eq': ['$details', 'viewed'] },
            1, // if true
            0] // else
    }
  }
}

答案 2 :(得分:1)

可能以下示例对您有用。

假设您有以下样本数据。

db.sample.insert([
{
  "_id" : 27001,
  "assigned_to" : "abc@xyz.com",
  "priority" : "High"
}
,{
  "_id" : 27002,
  "assigned_to" : "jkdj@xyz.com",
  "priority" : "Low"
},
{
  "_id" : 27003,
  "assigned_to" : "abc@xyz.com",
  "priority" : "High"
}
]);

使用以下聚合查询获取

1.总计数

2.Count,其中assigend_to是“abc@xyz.com”

3.Count,优先级为“高”

db.sample.aggregate({$group:{
                                 _id: 0,total:{$sum:1},
                                'assigned_to' : { $sum : { $cond: [ {  $eq: [ '$assigned_to' , 'abc@xyz.com' ] }, 1, 0 ] } },
                                'hight_priority' : { $sum : { $cond: [ {  $eq: [ '$priority' , 'High' ] }, 1, 0 ] } }
                              } 
                        } 
                      );

您将获得预期结果

{
    "result" : [
        {
            "_id" : 0,
            "total" : 3,
            "assigned_to" : 2,
            "hight_priority" : 2
        }
    ],
    "ok" : 1
}