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

MongoDB聚合如何按收发双方双向配对分组统计未读消息数

问题原因

你之前的写法错误在于$or是逻辑运算符,返回的是布尔值,只会将数据分为true和false两组,无法实现双向配对的分组效果。

实现思路

要实现AB/BA、AC/CA归为同一组,核心是生成统一的分组标识:将User和Receiver两个字段按固定规则(比如字典序)排序后拼接,不管两个用户谁是发送方谁是接收方,生成的分组键完全一致。

正确聚合语句

db.你的集合名.aggregate([
  {
    $group: {
      // 按排序后的用户对生成分组键,保证双向配对归为同一组
      _id: {
        $concat: [
          { $min: ["$User", "$Receiver"] },
          "_",
          { $max: ["$User", "$Receiver"] }
        ]
      },
      // 统计未读消息数,逻辑和你原有写法一致
      Messages: {
        $sum: {
          $cond: [{ $eq: ["$IsRead", false] }, 1, 0]
        }
      }
    }
  },
  // 可选阶段:如果需要输出"AB OR BA"格式的组合字段,添加以下投影逻辑
  {
    $project: {
      _id: 0,
      "Combined Field": {
        $concat: [
          { $substrCP: ["$_id", 0, 1] },
          { $substrCP: ["$_id", 2, 1] },
          " OR ",
          { $substrCP: ["$_id", 2, 1] },
          { $substrCP: ["$_id", 0, 1] }
        ]
      },
      Messages: 1
    }
  }
])

结果验证

针对你给出的示例数据,执行上述语句后会输出完全匹配要求的统计结果:

Combined FieldMessages
AB OR BA3
AC OR CA2

内容的提问来源于stack exchange,提问作者Tdby。

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 09:45:08