Mongo 逐对聚合

Posted

技术标签:

【中文标题】Mongo 逐对聚合【英文标题】:Mongo aggregate group by pair 【发布时间】:2021-12-21 05:36:19 【问题描述】:

我有这样的收藏

User Receiver IsRead
A B false
B A false
A B false
A C false
C A false

如何按用户和接收者分组以获得这样的结果

Combined Field Messages
AB OR BA 3
AC OR CA 2

试过了

$group: 
    _id: $or: [userId: "$recipientId", recipientId: "$userId", userId: "$userId", recipientId: "$recipientId"],
    messages: $sum: $cond: [$eq: ['$isRead', false], 1, 0] // count

【问题讨论】:

【参考方案1】:

您可以将$group 键设置为UserReceiver 字段的$setUnion

db.collection.aggregate([
  
    $group: 
      _id: 
        "$setUnion": [
          [
            "$User"
          ],
          [
            "$Receiver"
          ]
        ]
      ,
      "Messages": 
        $sum: 
          "$cond": 
            "if": 
              $not: "$IsRead"
            ,
            "then": 1,
            "else": 0
          
        
      
    
  
])

这是Mongo playground 供您参考。

【讨论】:

以上是关于Mongo 逐对聚合的主要内容,如果未能解决你的问题,请参考以下文章

在 mongo 聚合中使用当前文档键

GroupBy 聚合,包括 mongo 中的缺失日期

mongo聚合例子

Mongo 聚合游标和计数

通过 mongo 聚合管道使用 $match 两次

运行查询时,mongo上的聚合函数运行速度非常慢