MongoDB查询问题:找场景中对话最多的诗歌,用$group等操作结果异常
解决MongoDB聚合查找对话最多诗歌文档的问题
看起来你已经在尝试用聚合操作解决问题,但可能在步骤顺序或操作符使用上出了点小问题。先假设你的诗歌文档结构大概是这样的(如果和你的实际结构有出入,可以调整对应的操作):
{ "_id": ObjectId("60d21b4667d0d8992e610c85"), "title": "The Road Not Taken", "scenes": [ { "location": "forest", "says": [ {"speaker": "narrator", "line": "Two roads diverged in a yellow wood..."}, {"speaker": "narrator", "line": "And sorry I could not travel both..."} ] }, { "location": "crossing", "says": [{"speaker": "narrator", "line": "Oh, I kept the first for another day..."}] } ] }
下面分两种常见需求给出正确的聚合管道:
需求1:找所有诗歌中单个场景对话最多的诗歌文档
如果你的目标是找出某一首诗歌里,有一个场景的对话条数是所有诗歌所有场景里最多的,用这个管道:
db.poems.aggregate([ // 先把每个场景单独拆成一条文档 { $unwind: "$scenes" }, // 给每个场景计算对话数量 { $addFields: { "scenes.saysCount": { $size: "$scenes.says" } } }, // 按对话数量从多到少排序 { $sort: { "scenes.saysCount": -1 } }, // 取第一条就是对话最多的场景所在的诗歌 { $limit: 1 } ])
需求2:找所有场景对话总数最多的诗歌文档
如果你的目标是统计每首诗歌所有场景的对话总和,然后找总和最大的那首,用这个管道:
db.poems.aggregate([ // 计算当前诗歌所有场景的对话总数 { $addFields: { totalSays: { $sum: { $map: { input: "$scenes", as: "scene", in: { $size: "$$scene.says" } } } } } }, // 按总对话数降序排序 { $sort: { totalSays: -1 } }, // 取总对话最多的那首诗歌 { $limit: 1 } ])
你可能踩坑的地方
- 没有正确
$unwind场景数组:如果直接在整个scenes数组上计算长度,得到的是场景数量而不是对话数量 - 操作符使用错误:比如用
$size的时候没定位到says数组,而是定位到了scenes数组 - 分组逻辑错误:如果用
$group时没选对分组键(比如按诗歌ID分组而不是场景),会导致统计结果偏差
如果你的文档结构和我假设的不一样(比如scene不是数组,或者says是嵌套对象而非数组),可以调整对应的操作符适配你的结构~
内容的提问来源于stack exchange,提问作者Konstantin Chsherbakov
相关产品推荐
相关产品推荐

