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

MongoDB Shell聚合报错TypeError解决及分组统计需求咨询

问题与解决:Mongo Shell聚合管道执行报错处理

集合数据

[
  {
    "_id": {"$oid": "63873b95c7e956270e734f3c"},
    "employeeId": "emp1",
    "users": [
      {"name": "Allen","registered": true},
      {"name": "Henry","registered": true},
      {"name": "Adam","registered": false}
    ],
    "tags": ["good","excellent","average"]
  },
  {
    "_id": {"$oid": "63873c05c7e956270e734f3d"},
    "employeeId": "emp2",
    "users": [
      {"name": "Federick","registered": false},
      {"name": "Mary","registered": true},
      {"name": "Sam","registered": false}
    ],
    "tags": ["poor","excellent", "good"]
  },
  {
    "_id": {"$oid": "63873c1fc7e956270e734f3e"},
    "employeeId": "emp3",
    "users": [
      {"name": "john", "registered": true},
      {"name": "jack","registered": true},
      {"name": "elle", "registered": false }
    ],
    "tags": ["very good", "excellent", "good" ]
  }
]

需求

按tags分组,统计每个标签下的员工数量。

可用的Python聚合管道

以下Python代码可得到正确结果(已修正原代码中重复定义employees字段的问题):

pipeline = [
  {"$unwind":"$users"},
  {"$match":{"users.registered":True}},
  {"$unwind":"$tags"},
  {"$group": {
    "_id": "$tags",
    "employees": {"$addToSet" : "$employeeId"}, 
    "count": {"$sum": 1}
  }},
  {"$project":{"_id":1,"employees":1,"size":{"$size":"$employees"}}},
  {"$sort" : { "size": -1 } }
]
rec = db.ratings.aggregate(pipeline)

Mongo Shell执行报错

在Mongo Shell中执行时出现错误:

TypeError: ({$unwind:{path:"$tags", preserveNullAndEmptyArrays:true}}) is not iterable

解决方法

报错核心原因是聚合管道格式不符合Mongo Shell语法要求,需修正为以下正确命令:

db.ratings.aggregate([
  { "$unwind": "$users" },
  { "$match": { "users.registered": true } },
  { "$unwind": "$tags" },
  { "$group": {
    "_id": "$tags",
    "employees": { "$addToSet": "$employeeId" },
    "count": { "$sum": 1 }
  }},
  { "$project": { "_id": 1, "employees": 1, "size": { "$size": "$employees" } } },
  { "$sort": { "size": -1 } }
])

错误原因解析

触发该错误通常是因为执行聚合时未将所有阶段包裹在数组中,比如误写为db.ratings.aggregate({$unwind:...})而非数组形式。Mongo Shell的aggregate方法要求传入可迭代的数组作为参数,单个对象会被判定为不可迭代,从而抛出错误。

内容的提问来源于stack exchange,提问作者Mila

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 09:35:22