我试图用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;
答案 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
}