Python MongoDB聚合查询结果如何用Jinja2分别展示?
问题:Jinja2无法正确展示MongoDB聚合查询的平台统计值
我用Python查询MongoDB获取各平台的计数,聚合管道代码如下:
pipeline = [ {"$unwind": '$account_details'}, {"$group": {"_id": {"platform": "$account_details.platform"}, "count": {"$sum": 1}}} ] cursor = coll.aggregate(pipeline) result = list(cursor)
查询结果是:
[{u'count': 5, u'_id': {u'platform': u'windows'}}, {u'count': 926, u'_id': {u'platform': u'Linux'}}]
现在用Jinja2模板展示结果,尝试用{{ result.windows.count }}语法无法正确获取数值,请问该如何分别展示这些统计值?
解决方案
嘿,问题出在你对result的结构理解上——它是一个列表,不是以平台名为键的嵌套字典,所以result.windows.count这种写法自然行不通。每个列表元素是独立的字典,平台名称藏在_id.platform里,count是对应的统计数。
这里给你两种可行的解决办法:
方法一:在Python端预处理结果(推荐)
把聚合得到的列表转换成一个以平台名为键的字典,这样在Jinja2里调用会非常直观:
# 转换结果格式 platform_counts = {} for item in result: platform_name = item['_id']['platform'] platform_counts[platform_name] = item['count'] # 之后把platform_counts传入Jinja2模板,而不是原来的result
现在在模板里就可以直接这样写:
Windows平台数量:{{ platform_counts.windows }} Linux平台数量:{{ platform_counts.Linux }}
方法二:在Jinja2模板中直接处理列表
如果不想修改Python代码,也可以在模板里用Jinja2的过滤器来定位元素:
方式1:循环展示所有平台
如果要把所有平台的统计值都列出来,用循环最方便:
{% for stat in result %} <p>{{ stat._id.platform }}:{{ stat.count }}</p> {% endfor %}
方式2:单独获取指定平台的数值
如果只需要展示某个特定平台的数值,可以用selectattr过滤器筛选出对应的元素:
{% set windows_stat = result | selectattr('_id.platform', 'equalto', 'windows') | first %} Windows平台数量:{{ windows_stat.count }} {% set linux_stat = result | selectattr('_id.platform', 'equalto', 'Linux') | first %} Linux平台数量:{{ linux_stat.count }}
这样就能完美解决你的问题啦!
内容的提问来源于stack exchange,提问作者Matthew White
相关产品推荐
相关产品推荐

