MongoDB聚合查询重复台词最多的场景(需输出剧名、幕、场)
莎士比亚戏剧数据集重复台词最多场景查询修正方案
原查询的核心偏差
原语句的统计逻辑完全偏离需求:直接对单条台词文本做全局计数,本质是统计整个数据集里相同文本台词的总出现次数,既没有绑定台词所属的场景信息,也没有按场景维度聚合重复值,自然拿不到对应剧名、幕号、场号的关联结果;同时逐层unwind过程没有保留场景、剧目本身的定位字段,后续统计完全丢失了上下文关联。
修正后的聚合执行逻辑
- 逐层拆解嵌套结构,每一层拆解时同步保留对应的定位字段:剧目名称、幕的索引、场的索引
- 先按「场景+具体台词文本」分组,统计同一场景内重复出现的台词次数
- 过滤掉仅出现1次的非重复台词,再按场景维度汇总累计重复台词总条数
- 按重复总条数降序排序,取排名第一的场景即为所求目标
可直接运行的修正查询
db.william.aggregate([ // 拆解幕层级,保留幕的位置索引 { $unwind: { path: "$acts", includeArrayIndex: "act_index" } }, // 拆解场层级,保留场的位置索引 { $unwind: { path: "$acts.scenes", includeArrayIndex: "scene_index" } }, // 拆解场景下的动作段落 { $unwind: "$acts.scenes.action" }, // 拆解单条台词 { $unwind: "$acts.scenes.action.says" }, // 按场景+单条台词分组,统计场景内同台词的重复次数 { $group: { _id: { play_name: "$name", // 数据集顶层存储的剧目名字段 act_no: { $add: ["$act_index", 1] }, // 数组索引从0开始,转换为常规从1计数的幕号 scene_no: { $add: ["$scene_index", 1] }, // 转换为常规从1计数的场号 line_text: "$acts.scenes.action.says" }, single_line_repeat: { $sum: 1 } } }, // 过滤掉非重复的单次出现台词 { $match: { single_line_repeat: { $gt: 1 } } }, // 按场景汇总,统计单场景内所有重复台词的总条数 { $group: { _id: { play_name: "$_id.play_name", act_no: "$_id.act_no", scene_no: "$_id.scene_no" }, scene_total_repeat: { $sum: "$single_line_repeat" } } }, // 按重复条数降序排序,取重复值最高的场景 { $sort: { scene_total_repeat: -1 } }, { $limit: 1 } ])
输出结果说明
返回条目会直接携带需求要求的全部定位信息:对应所属剧名、幕号、场号,同时附带该场景的累计重复台词总数值,完全匹配查询目标。
内容的提问来源于stack exchange,提问作者Json
相关产品推荐
相关产品推荐

