You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:45:19