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

MongoDB聚合查询提取mariners数组this_ship_capacity字段值的实现咨询

调整后的聚合查询实现方案

原查询的核心问题

  • $exists参数传入了字符串值"true",MongoDB识别的匹配值是布尔类型true,字符串形式会导致匹配规则失效
  • 没有对mariners嵌套数组做打散操作,始终保留文档级的嵌套结构
  • $filter的条件逻辑引用错误:判断的是整个数组的类型而非数组内的单个元素,过滤逻辑完全不生效

调整后的查询逻辑

  1. 先做正确的存在性匹配,筛出包含this_ship_capacity字段的文档
  2. 用$unwind操作将mariners数组拆分为独立的单条文档,从根源消除数组嵌套结构
  3. 做字段投影时直接把目标值提升到文档顶层,完全去掉mariners的嵌套层级
  4. 最后过滤掉拆分后没有有效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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.24 11:15:02