MongoDB合并/合并两个聚合的结果?

时间:2019-12-08 20:37:53

标签: mongodb mongodb-query aggregation-framework

我该如何编写查询/汇总信息以使我能够发送和接收消息的总数? 例如,“发件人”字段中存在A,并且“发件人”字段中的列表之一中也存在A,则应对其进行计数。

    { "_id" : 1, "from" : "A", "To" : [B,C,F], "message":"lorem ipsum" }
    { "_id" : 2, "from" : "B", "To" : [A] , "message":"lorem ipsum" }
    { "_id" : 3, "from" : "C", "To" : [A,E] , "message":"lorem ipsum"}
    { "_id" : 4, "from" : "D", "To" : [E] , "message":"lorem ipsum"}
    { "_id" : 6, "from" : "A", "To" : [E,B ], "message":"lorem ipsum" }

此示例的总数为3(A,B,C),D不计算在内,因为D仅发送了一条消息而没有收到任何消息

我已经能够有一个“发件人”字段的独特列表,然后展开“收件人”字段并得到另一个列表。但是现在,我只能将两种结果结合在一起。

1 个答案:

答案 0 :(得分:1)

这个想法是将所有文档分组以得到2个数组,并得到交集 的数组。

db.collection.aggregate([
  {
    $group: {
      _id: null,
      froms: {
        $addToSet: "$from"
      },
      tos: {
        $push: "$To"
      }
    }
  },
  {
    $addFields: {
      tos: {
        $reduce: {
          input: "$tos",
          initialValue: [],
          in: {
            $setUnion: [
              "$$value",
              "$$this"
            ]
          }
        }
      }
    }
  },
  {
    $addFields: {
      count: {
        $size: {
          $setIntersection: [
            "$froms",
            "$tos"
          ]
        }
      }
    }
  }
])

第一阶段汇总所有文档,并创建“收件人”和“发件人”的数组。

第二阶段只是减少'tos'数组,因为它将是第一阶段之后的数组。

第三个也是最后一个阶段将获取由“ tos”和“ froms”数组相交得到的数组大小。

您可以here对其进行测试