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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:41:52