mongodb - Mongodb 成对分组
问题描述
我有这样的数据:DATA ,我尝试按域名分组,我希望结果看起来像这样:
[{
{ "domain": "gmail_com_"
"A": 3
"B": 5
"C": 3 },
............
}]
其中 A,B 是匹配域名列表的长度,C 是重复 IP 地址的大小。但是正如您在结果中看到的那样,如果域名出现在两个以上的差异时间戳中,它只会与两个第一个,我想用所有的可能性将两个两个分组,在我的例子中,facebook 存在于 3 diff tsp 中,所以我们应该有三个 diff 对。如果有人可以帮助我。谢谢
解决方案
要从一系列文档中获取每对可能的两个离散值,您需要:
- 将值收集到一个数组中
- 分配某种索引来识别每个
- 复制数组
- 展开两个重复项
- 消除具有相同索引的对
聚合管道可能如下所示:
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
您可以根据需要进行处理。