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
相关产品推荐
相关产品推荐

