MongoDB报Unrecognized expression '$push' 按subject、topic、subtopic分组求解
报错原因
$push 是$group阶段的顶层累加操作符,不支持嵌套在$addToSet的内部表达式中使用,你当前的写法直接把$push放在了$addToSet的字段定义里,因此MongoDB无法识别这个表达式。
正确聚合实现
要实现subject -> topic -> subtopic的三级分组结构,你需要分两次$group完成聚合:
- 第一次联合
subject和topic作为分组主键,先归集每个topic下的所有subtopic - 第二次仅按
subject作为分组主键,将同subject下的所有topic组装成目标数组结构
完整聚合管道代码如下:
db.collection.aggregate([ // 第一次分组:按subject + topic联合分组,归集subtopic { $group: { _id: { subject: "$subject", topic: "$topic" }, subtopics: { $push: "$subtopic" } } }, // 第二次分组:仅按subject分组,组装topics数组结构 { $group: { _id: "$_id.subject", topics: { $push: { topicName: "$_id.topic", subtopics: "$subtopics" } } } }, // 可选:调整输出字段名,把_id改为subject { $project: { _id: 0, subject: "$_id", topics: 1 } } ])
输出说明
针对你给出的示例数据,上面的聚合会输出如下结果:
{ "subject": "app development", "topics": [ { "topicName": "dart", "subtopics": ["flutter2", "flutter"] }, { "topicName": "javascript", "subtopics": ["react native"] } ] }
如果需要对topic或者subtopic去重,把对应位置的$push换成$addToSet即可。
内容的提问来源于stack exchange,提问作者Anand CA
相关产品推荐
相关产品推荐

