我想把下面的mysql查询转换成mongodb查询。
SELECT substring(o.schedule_datetime,1,4) 'Year',
SUM(IF(o.order_status in ('SUCCESS','#SUCCESS'),1,0)) 'SUCCESS'
FROM (
select group_concat(distinct ifnull(os.order_status,'') order by os.order_status
separator '#') 'order_status',schedule_datetime
from order_summary os group by order_number
)o group by 1 desc;
例如:我有样表
id order_number product_number order_status schedule_datetime
1 001 001.1 SUCCESS 20180103
2 001 001.2 SUCCESS 20180102
3 111 111.1 SUCCESS 20171225
4 111 111.2 SUCCESS 20171224
5 222 222.1 INPROGRESS 20171122
6 222 222.2 SUCCESS 20171121
我使用上面的mysql查询获得订单状态成功的输出
Year SUCCESS
2018 1
2017 1
我已经使用分隔符(#)将多个雕像组合为字符串,并按状态获得所需的结果,为了取得进展,我将更改sum函数,如下所示:
SUM(IF(o.order_status in ('INPROGRESS','INPROGRESS#SUCCESS', '#INPROGRESS','#INPROGRESS#SUCCESS'),1,0)) 'INPROGRESS'
我曾尝试编写mongodb查询,但在mysql查询中遇到了如何将sum和if条件以及groupconcat与separator组合的问题。
db.order_summary.aggregate([
{ "$project" :
{ "orderDate" : 1 , "subOrderDate" : { "$substr" : [ "$order_date" , 0 , 4]},
"order_number":"$order_number"
},
} ,
{ "$group":{
"_id": { "order_number" : "$order_number", "Year": "$subOrderDate", "order_status":{"$addToSet":{"$ifNull":["$order_status",'']}}}
}
},
{ "$group": {
"_id": "$_id.Year", "count": { "$sum": 1 }
}
},
{ "$sort" : { "_id" : -1}}
])
任何帮助我们的人都将不胜感激,谢谢
1条答案
按热度按时间cxfofazt1#
mongodb中没有类似于组的功能。
在3.4版本中,您可以将最后一个组中匹配值的数组与$in运算符进行比较。
第一
$group
获取订单号和订单状态组合的所有不同订单状态。$sort
排序订单状态。第二
$group
按订单号推送所有已排序的状态值。最终
$group
将每年的状态与所有匹配的状态输入列表和输出总数进行比较。