MongoDB聚合查询提取mariners数组this_ship_capacity字段值的实现咨询
调整后的聚合查询实现方案
原查询的核心问题
$exists参数传入了字符串值"true",MongoDB识别的匹配值是布尔类型true,字符串形式会导致匹配规则失效- 没有对
mariners嵌套数组做打散操作,始终保留文档级的嵌套结构 $filter的条件逻辑引用错误:判断的是整个数组的类型而非数组内的单个元素,过滤逻辑完全不生效
调整后的查询逻辑
- 先做正确的存在性匹配,筛出包含
this_ship_capacity字段的文档 - 用
$unwind操作将mariners数组拆分为独立的单条文档,从根源消除数组嵌套结构 - 做字段投影时直接把目标值提升到文档顶层,完全去掉
mariners的嵌套层级 - 最后过滤掉拆分后没有有效
this_ship_capacity值的无效记录
可直接运行的代码
cursor = db.data.aggregate([ # 修正$exists的参数类型为布尔值 {"$match": {"mariners.this_ship_capacity": {"$exists": True}}}, # 打散mariners数组,移除外层嵌套 {"$unwind": "$mariners"}, # 投影时将目标字段提升至文档顶层,去除嵌套结构 {"$project": { "_id": 0, "this_ship_capacity": "$mariners.this_ship_capacity" }}, # 过滤空值记录 {"$match": {"this_ship_capacity": {"$ne": None}}} ])
后续DataFrame转换
上述查询执行后,每条返回结果都是无嵌套的纯净结构,直接转换即可:
import pandas as pd # 将游标转为列表后构造DataFrame df = pd.DataFrame(list(cursor))
调整后的返回结果示例:
{'this_ship_capacity': 'Mate'} {'this_ship_capacity': '$'} {'this_ship_capacity': 'Master'}
如果需要将所有值汇总为单个数组做批量统计,可以在最后追加$group阶段:
# 追加阶段示例:将所有capacity值聚合为一维纯列表 {"$group": { "_id": None, "all_capacities": {"$push": "$this_ship_capacity"} }}
内容的提问来源于stack exchange,提问作者num_t_nfs
相关产品推荐
相关产品推荐

