首页 > 解决方案 > Mongodb 成对分组

问题描述

我有这样的数据:DATA  ,我尝试按域名分组,我希望结果看起来像这样:

[{     
{       "domain": "gmail_com_"
    "A": 3
    "B": 5
    "C": 3 },
............
}]

其中 A,B 是匹配域名列表的长度,C 是重复 IP 地址的大小。但是正如您在结果中看到的那样,如果域名出现在两个以上的差异时间戳中,它只会与两个第一个,我想用所有的可能性将两个两个分组,在我的例子中,facebook 存在于 3 diff tsp 中,所以我们应该有三个 diff 对。如果有人可以帮助我。谢谢

标签: mongodb

解决方案


要从一系列文档中获取每对可能的两个离散值,您需要:

  • 将值收集到一个数组中
  • 分配某种索引来识别每个
  • 复制数组
  • 展开两个重复项
  • 消除具有相同索引的对

聚合管道可能如下所示:

db.collection.aggregate([
  {$group:{
     _id:"$domain",
     list:{$push:"$ip"}
  }},
  {$project:{
     numberedList:{
        $reduce: {
            input: "$list",
            initialValue: {a:[],c:0},
            in:{ 
                a:{$concatArrays:["$$value.a",[{ip:"$$this",idx:"$$value.c"}]]},
                c:{$add:["$$value.c",1]}
  }}}}},
  {$project:{
      left:"$numberedList",
      right:"$numberedList"
  }},
  {$unwind:"$left"},
  {$unwind:"$right"},
  {$match:{$expr:{$ne:["$left.idx","$right.idx"]}}}
])

这应该会给您留下域名_id和一对结果,left然后right您可以根据需要进行处理。


推荐阅读