用Mongodb与flask-sqlalchemy分别实现分段统计

统计60分以上各分段的人数

grade = [x*10 for x in range(611)]

# MongoDB
query = {"mark": {"$gte": grade[0], "$lte": grade[-1]}}
data1 = list(current_app.mongo.db.exam.aggregate([
    {"$match": query},
    {"$bucket": {
        "groupBy": "$grade",
        "boundaries": grade
    }}
]))

# Flask-SQLalchemy + Mysql
case_item = [(Model.grade >= i, i) for i in grade]  # (分段条件,分段名)
case_item.reverse()
data_ = Model.query.with_entities(
    case(case_item, else_="other").label('_id'),
    func.count(1).label('count')
).filter(
    Model.grade >= grade[0],
    Model.grade <= grade[-1]
).group_by(case(case_item, else_="other")).all()
data2 = [i._asdict() for i in data_]

# output
print(data1)
print(data2)

>> [{"_id": 60, "count": 5}, {"_id": 70, "count": 4}, {"_id": 80, "count": 5}, {"_id": 90, "count": 5}, {"_id": 100, "count":2}]
>> [{"_id": "60", "count": 5}, {"_id": "70", "count": 4}, {"_id": "80", "count": 5}, {"_id": "90", "count": 5}, {"_id": "100", "count":2}]

mongodb就不介绍了,查看mongodb手册的$bucket词条即可。

简单说说Flask-sqlalchemy的实现。
Model.query.with_entities()是db.session.query()的model实现方式,主要是用于设置select field名。

在mysql里实现分段的语句是CASE WHEN,故在此需要引用case()函数,他接受一个分段条件数组,这个数组需要注意条件顺序,这个可自己实验,我就不多说了。

_asdict()是用于把model对象转换为字典类型的函数。

需要注意的是,在sqlalchemy中,即使把分段名设为整型,在输出时也会被转换为字符型。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值