2012-01-20 47 views
2

我正在尝试使用Mongo进行一些测试,我已经找到了一些更简单的MySQL查询Mongo等价物。MongoDB - MySQL SUM(CASE WHEN)等价吗?

我有这个疑问这是一个有点复杂,我需要帮助...

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; 
+1

呃......这不是很好的关系练习......“细节”列中的数据应该标准化 - 对于NoSQL db设计也是如此,column:action =(view | web | thumb | export | print),那么你只需切换到一个组。 – Rudu

+0

它的一堆日志文件,我刚刚得到了什么有32万条记录 – rreeves

+2

然后[ETL](http://en.wikipedia.org/wiki/Extract,_transform,_load)它一次(如果它是静态的 - 或建立一个加载/转换过程用于重复加载),以便它被标准化。这将大大简化你想要做的事情。 – Rudu

回答

1

我会Rudu这里达成协议,你应该尝试打破细节到蒙戈文件的密钥。

该文件可能包含一个对象是这样的:

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

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

但是,无论您是否决定这么做,您都会希望使用map reduce。您可以在地图期间发出包含详细信息的项目(通过使用正则表达式处理它们,或者简单地以重新构造的形式发出键)并在缩小阶段对它们进行求和。

你可以阅读更多关于它的docs

1

可能在下面的示例中对您有用。

假设您有以下示例数据。

db.sample.insert([ 
{ 
    "_id" : 27001, 
    "assigned_to" : "[email protected]", 
    "priority" : "High" 
} 
,{ 
    "_id" : 27002, 
    "assigned_to" : "[email protected]", 
    "priority" : "Low" 
}, 
{ 
    "_id" : 27003, 
    "assigned_to" : "[email protected]", 
    "priority" : "High" 
} 
]); 

使用下面汇总查询来获取

1.Total计数

2.Count其中assigend_to是 “[email protected]

3.Count其中优先级为“高“

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

,你会得到预期的结果

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