Mongodb分组对

Mongodb分组对,mongodb,Mongodb,我有这样一个数据:,我尝试按域名分组,我希望结果如下: [{ { "domain": "gmail_com_" "A": 3 "B": 5 "C": 3 }, ............ }] 其中A,B是匹配域名列表的长度,C是重复ip地址的大小。但正如您在结果中看到的,如果域名存在于两个以上的diff timestamp中,那么它只会与前两个一组,在我的示例中,我想以所有可能的方式将两个二组,facebook存在于3diff tsp中,因此我们应

我有这样一个数据:,我尝试按域名分组,我希望结果如下:

[{     
{       "domain": "gmail_com_"
    "A": 3
    "B": 5
    "C": 3 },
............
}]
其中A,B是匹配域名列表的长度,C是重复ip地址的大小。但正如您在结果中看到的,如果域名存在于两个以上的diff timestamp中,那么它只会与前两个一组,在我的示例中,我想以所有可能的方式将两个二组,facebook存在于3diff tsp中,因此我们应该有三个diff对。如果有人能帮我。
thnx

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

  • 将值收集到一个数组中
  • 指定某种索引来标识每个索引
  • 复制数组
  • 展开两个副本
  • 消除具有相同索引的对
聚合管道可能如下所示:

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"]}}}
])

这将为您留下
\u id
中的域名,以及
left
right
中的一对结果,然后您可以根据需要进行处理。

因此,如果一个域的输入数据中有10个文档,您需要90个输出文档,每一对都有一个?@Joe是的,这是因为外部链接有改变或消失的趋势,这会使这个问题失去相当大的价值。请在问题中列出您的数据和查询的样本。我怀疑这就是有人否决您的问题的原因,尽管他们懒得评论。如果你编辑你的问题来添加这些信息,他们可能会取消否决票。对不起,你的查询似乎在语法上不正确()是的,输入错误,我在一个阶段错过了一个大括号。现在已修复。抱歉,当我测试时没有找到文档。如果您可以在问题中添加一些示例数据,我将能够调整查询以适合您的数据。