转换mysql查询包含sum和group_concat到mongodb查询

时间:2018-01-04 13:31:29

标签: mysql mongodb mongodb-query aggregation-framework

我想将下面的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查询获取输出订单状态SUCCESS

Year SUCCESS
2018 1
2017 1

我使用了分隔符(#)将多个雕像组合成字符串并按状态获得所需的结果,以获得INPROGRESS我将只更改SUM功能,如下所示:

SUM(IF(o.order_status in ('INPROGRESS','INPROGRESS#SUCCESS', '#INPROGRESS','#INPROGRESS#SUCCESS'),1,0)) 'INPROGRESS' 

我曾尝试编写mongodb查询,但遇到了如何将sum和if条件以及group_concat与seperator结合起来,如我在mysql查询中使用的那样。

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 个答案:

答案 0 :(得分:1)

mongodb中没有Group_Concat类功能。

您可以将最后一组中匹配值的数组与3.4版本中的$in运算符进行比较。

首先security: encoders: FOS\UserBundle\Model\UserInterface: sha512 role_hierarchy: ROLE_ADMIN: ROLE_USER ROLE_SUPER_ADMIN: ROLE_ADMIN providers: steamauth: id: steam.user_provider fos_userbundle: id: fos_user.user_provider.username firewalls: main: provider: steamauth pattern: ^/ form_login: provider: fos_userbundle logout: true anonymous: true form_login: login_path: login check_path: login_check steam: default_route: controller.dashboard.home access_control: - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY } - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY } - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY } - { path: ^/dashboard, role: ROLE_LOGGED_STEAM_USER } 获取订单编号和订单状态组合的所有不同订单状态。

$group对订单状态进行排序。

第二个$sort按订单号推送所有已排序的状态值。

最终$group将每年的状态与所有匹配的输入状态列表和输出总数进行比较。

$group