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 Field | Messages |
|---|---|
| AB OR BA | 3 |
| AC OR CA | 2 |
内容的提问来源于stack exchange,提问作者Tdby。
相关产品推荐
相关产品推荐

