龙空技术网

枚举若干需要使用MongoDB中aggregate的业务场景

Hello周同学 92

前言:

当前看官们对“mysql按周分组”都比较重视,我们都想要了解一些“mysql按周分组”的相关内容。那么小编在网摘上汇集了一些关于“mysql按周分组””的相关知识,希望咱们能喜欢,我们一起来学习一下吧!

1、查询某个门店下的商品信息,包含商品主要信息、大中小分类信息

需求背景:

前端选择门店之后,加载门店商品,需要在页面上显示出商品的主要信息以及商品相关的分类信息

结构信息:

1】门店商品表:store_goods(关联字段:store_goods.goods_code -> goods.code)

2】商品主表:goods(关联字段:goods.small_category_id -> goods.code)

3】商品分类表:goods_category(最多三级,分类的上级分类ID存储在parent_id字段内,顶级分类的parent_id=0)

语法说明:

1】将store_goods通过直接的goods_code字段与goods中的code设置字段关联,并将查询结果集放在goods_master中

2】筛选出store_code="S6"的结果集

3】将$goods_master进行拆分,"preserveNullAndEmptyArrays": true,相当于left join

4】对3的结果集挑选出需要的字段,主要是为了需要用到的商品主表字段

5】将4的结果集与goods_category进行关联,由于主表中只有小分类ID,所以将goods_master.small_category_id与goods_category.id进行关联,并将查询结果集放在small_category中

6】对5的结果集,针对small_category进行拆分,再次通过small_category.parent_id与goods_category.id进行关联,这样就可以找到当前小分类所属的中分类信息,将查询结果集放在mid_category中

7】对6的结果集,针对mid_category进行拆分,再次通过mid_category.parent_id与goods_category.id进行关联,这样就可以找到当前中分类所属的大分类信息,将查询结果集放在big_category中

8】最后,对7的结果集针对big_category进行拆分

门店商品结构:

商品结构:

商品分类结构:

db.store_goods.aggregate([   {     "$lookup": {               "from": "goods",               "localField": "goods_code",               "foreignField": "code",               "as": "goods_master"          }},{     "$match": {          "store_code": "S6"     }},{     "$unwind": {          "path": "$goods_master",          "preserveNullAndEmptyArrays": true     }},{     "$project": {          "_id": 0,          "store_code": 1,          "store_name": 1,          "goods_code": 1,          "goods_master.last_inprice": 1,          "goods_master.name": 1,          "goods_master.sales_price": 1,          "goods_master.goods_spec": 1,          "goods_master.goods_vendor": 1,          "goods_master.small_category_id": 1     }},{     "$lookup": {               "from": "goods_category",               "localField": "goods_master.small_category_id",               "foreignField": "id",               "as": "small_category"          }},{     "$unwind": {          "path": "$small_category",          "preserveNullAndEmptyArrays": true     }},{     "$lookup":  {               "from": "goods_category",               "localField": "small_category.parent_id",               "foreignField": "id",               "as": "mid_category"          }},{     "$unwind": {          "path": "$mid_category",          "preserveNullAndEmptyArrays": true     }},{     "$lookup": {               "from": "goods_category",               "localField": "mid_category.parent_id",               "foreignField": "id",               "as": "big_category"          }},{     "$unwind": {          "path" :   "$big_category",          "preserveNullAndEmptyArrays":  true     }}])
2、查询订单的入库明细

需求背景:

查看每个订单的入库情况(只查询存在入库记录的订单数据,相当于两张表进行inner join),一个订单可能按照批次多次入库,每次入库产生一个入库单

结构信息:

1】商品主表:bill

2】入库单主表:in_store (关联字段:in_store .bill_no -> bill.bill_no)

语法说明:

1】将bill通过直接的bill_no字段与in_store中的bill_no设置字段关联,并将查询结果集放在in_store中

2】针对$in_store进行拆分

3】按照bill_no维度进行分组,获取查询出来的总数、入库总数(每条入库单的total_goods_amount做sum)、最大的入库数和最小的入库数

4】挑出需要返回的字段

db.bill.aggregate([{    $lookup: {        "from": "in_store",          "localField": "bill_no",          "foreignField": "bill_no",          "as": "in_store"    }},{     "$unwind": {          "path": "$in_store",          "preserveNullAndEmptyArrays": false     }},{     $group: {          _id: '$bill_no',          bill_no: {$first: '$bill_no'},          count: {$sum: 1},          sumInAmount: {            "$sum": "$in_store.total_goods_amount"          },          maxNum: {$max: '$in_store.total_goods_amount'},          minNum: {$min: '$in_store.total_goods_amount'}     }},{    $project: {        'bill_no': 1,        'count':1,        'sumInAmount': 1,        'maxNum': 1,        'minNum': 1    }}])

3、查询商品库存信息(一)

需求背景:

商品库存存在多仓,且每个仓库录入库存时都会有不同的批次号。按照《商品编码, 仓库编码》进行分组,查看每个商品在每个仓库内的库存数、最大一次录入库存数、最小一次录入库存数、最早的批次号、最新的批次号

结构信息:

1】商品库存表:goods_store(关联字段:goods_store.goods_code -> goods.goods_code)

2】商品主表:goods

语法说明:

1】将goods_store通过直接的goods_code字段与goods中的goods_code设置字段关联,并将查询结果集放在goods_info中

2】将$goods_info拆分,"preserveNullAndEmptyArrays": false,作用相当于inner join,若后goods没有信息,当前行信息不显示

3】将2获取的结果集按照(goods_code,w_no)进行分组,获取每个门店不同商品的最大数量、最小数量、最大批次号、最小批次号,通江将goods_code和w_no用“-”拼接在一起,起个别名showName

4】对3的结果集挑选出需要的字段

db.goods_store.aggregate([{    $lookup: {        "from": "goods",		    "localField": "goods_code",		    "foreignField": "goods_code",		    "as": "goods_info"    }},{     "$unwind":   {          "path": "$goods_info",          "preserveNullAndEmptyArrays": false     }},{	$group: {		_id: {		    'goods_code': '$goods_code',		    'w_no': '$w_no',		},        showName: { $first : {$concat: [ "$goods_code", " - ", "$w_no" ]} },        costPrice: {$first: '$goods_info.cost_price'},		    totalNum: {$sum: '$num'},		    max_num: {$max: '$num'},        min_num: {$min: '$num'},        max_batch_no: {$max: '$batch_no'},        min_batch_no: {$min: '$batch_no'}	}},{    $project: {        '_id': 0,        'goodsCode': '$_id.goods_code',        'wno': '$_id.w_no',        'showName': 1,        'costPrice': 1,        'totalNum': 1,        'max_num': 1,        'min_num': 1,        'max_batch_no': 1,        'min_batch_no': 1    }}])

4、查询商品库存信息(二)

需求背景:

商品库存的计算不依赖于库存表(不存在库存表),依赖于入库单的商品明细与出库单的商品明细。也就是说,用入库单的商品明细内的每个商品的入库数量总数 扣减 对应出库单商品的出库总数。

结构信息:

1】商品库存表:goods_store(关联字段:goods_store.goods_code -> goods.goods_code)

2】商品主表:goods

语法说明:

1】先将in_store中的的in_goods拆分

2】将拆分后结果按照 $in_goods.goods_code 进行分组,获取每个商品的入库总数和总金额

3】将2的结果集与out_bill进行联表,关联字段为out_goods.goods_code,由于out_goods是数组,这样的匹配方式不是精确匹配,因为只要out_bill中的out_goods某条数据的goods_code等于关联数据,就会被查询出来,这样会导致不是精准匹配,于是我们将结果集out_list再次进行拆分

4】由于3是将out_bill结果集进行了拆分,我们需要知道里面的商品行数据,于是再次将$out_list.out_goods拆分

5】此时的结果集都是商品维度的了,但是却包含了一些两边goods_code不匹配的数据,我们借助$eq做个辅助字段isEqual,判断条件就是'$goods_code' 和 '$out_list.out_goods.goods_code'

6】经过5处理之后,我们查询isEqual为true的结果,这样就能够保证入库单那边的goods_code与现在出库单的goods_code一一对应了

7】经过6处理之后,结果集仍然不是我们想要的,可以看到100016079918有两条数据,但是他们的出库单号是不一样的,具体的原因在3中已经说明缘由。所以我们需要再次针对goods_code进行分组

8】分组的维度主要针对出库单这边,将商品的出库数量进行汇总

9】经过8处理后的结果集基本上就是我们想要的了,但是是没有经过计算的,如果需要通过查询直接返回剩余库存数,那么就再针对8结果集利用$subtract对"$totalAmount" 和 "$totalOutAmount" 做减法操作就行了,最终获取到每个商品的库存数leftAmount

db.in_store.aggregate([{     "$unwind": "$in_goods"},{     '$group': {          '_id': '$in_goods.goods_code',          'goods_code': {'$first': '$in_goods.goods_code'},          'totalAmount': {'$sum': '$in_goods.in_num'},          'totalMoney': {            "$sum": {                "$multiply": ["$in_goods.in_num", "$in_goods.in_price"]            }          }     }},{    "$lookup": {        "from": "out_bill",          "localField": "goods_code",          "foreignField": "out_goods.goods_code",          "as": "out_list"    }},{     "$unwind": {          "path": "$out_list",          "preserveNullAndEmptyArrays": false     }},{     "$unwind": {          "path": "$out_list.out_goods",          "preserveNullAndEmptyArrays": false     }},{    '$project': {        'goods_code': 1,        'totalAmount': 1,        'totalMoney': 1,        'out_no': '$out_list.out_no',        'out_code': '$out_list.out_goods.goods_code',        'out_amount': '$out_list.out_goods.amount',        'out_price': '$out_list.out_goods.price',        'isEqual': {            '$eq': ['$goods_code', '$out_list.out_goods.goods_code']        }    }},{    '$match': {        'isEqual': true    }},{     '$group': {          '_id': '$goods_code',          'goods_code': {'$first': '$goods_code'},          'totalAmount': {'$first': '$totalAmount'},          'totalMoney': {'$first': '$totalMoney'},          'totalOutAmount': {'$sum': '$out_amount'},          'totalOutMoney': {            "$sum": {                "$multiply": ["$out_amount", "$out_price"]            }          }     }},{    '$project': {        'goods_code': 1,        'leftAmount': {"$subtract": ["$totalAmount", "$totalOutAmount"]},        'leftMoney': {"$subtract": ["$totalMoney", "$totalOutMoney"]}    }},])

5、查询联系人下单情况

需求背景:

依据订单数据,首先按照会员分组查询出来会员和联系人信息,然后按照联系人分组查询订单情况

结构信息:

1】订单主表:bill

语法说明:

1】首先按照bill中的$backen_user_id字段分组,获取联系人和订单总金额

2】针对1的结果集挑出需要的字段

3】再次按照$link_mobile维度进行分组,获取订单总金额

4】挑出需要返回的字段

----- 对标的mysql查询语句 -----SELECT link_mobile, SUM(totalMoney) AS lastTotalMoneyFROM (     SELECT backen_user_id, link_mobile, SUM(total_money) AS totalMoney     FROM bill     GROUP BY backen_user_id) AS inner_dataGROUP BY link_mobile
db.bill.aggregate([{	$group: {		_id: {		    'backen_user_id': '$backen_user_id',		},        link_mobile: {$first: '$link_mobile'},		totalMoney: {$sum: '$total_money'}	}},{    $project: {        'userId': '$_id.backen_user_id',        'link_mobile': 1,        'totalMoney': 1       }},{	$group: {		_id: {		    'linkUser': '$link_mobile',		},        link_mobile: {$first: '$link_mobile'},		lastTotalMoney: {$sum: '$totalMoney'}	}},{    $project: {        'link_mobile': 1,        'lastTotalMoney': 1    }}])

标签: #mysql按周分组 #mysql表最大数量 #mysql获取总数