Mongodb 计算数组中项目的组合
Mongodb counting combination of items in array
我有这样的东西:
`
[
{
....
tags : ["A","B"]
},
{
....
tags : ["A","B"]
},
{
....
tags : ["J","K"]
},
{
....
tags : ["A","B","C"]
}
]`
使用聚合框架,我想按数组组合进行分组以获得如下内容:
[
{
_id:["A","B"],
count : 3
},
{
_id:["J","K"],
count : 1
},
{
_id:["A","C"],
count : 1
},
{
_id:["B","C"],
count : 1
},
]
可能吗?提前致谢
您可以使用 unwind
将数组元素分解为单独的文档。
然后你可以对每个求和得到结果。
db.collection.aggregate([
{ $unwind : "$newTags" },
{ $group:
{ "_id" : "$newTags",
"count":{$sum:1}
}
}])
查询
- 对于大小为 1 的每个标签,使其成为
["V"] -> ["V" null]
(如果你不想计算空值的对,你可以在最终结果中过滤掉)
- map,对于每个成员,我们和其他成员一起说
例如
["A" "B" "C"]
将与 ["B" "C"]
组合成“A”,
“B”连同 ["A" "C"]
等(我们算双倍,接下来我们将除以 2)
- 展开数组
- 成对分组,但短对
["A" "B"] = ["B" "A"]
- 取 0.5(而不是 1)(就像我们除以 2)
aggregate(
[ {
"$set" : {
"tags" : {
"$cond" : [ {
"$eq" : [ {
"$size" : "$tags"
}, 1 ]
}, {
"$concatArrays" : [ "$tags", [ null ] ]
}, "$tags" ]
}
}
}, {
"$set" : {
"a" : {
"$map" : {
"input" : "$tags",
"in" : {
"member" : "$$t",
"togetherWith" : {
"$setDifference" : [ "$tags", [ "$$t" ] ]
}
},
"as" : "t"
}
}
}
}, {
"$unwind" : {
"path" : "$a"
}
}, {
"$replaceRoot" : {
"newRoot" : "$a"
}
}, {
"$unwind" : {
"path" : "$togetherWith"
}
}, {
"$group" : {
"_id" : {
"$cond" : [ {
"$lt" : [ "$member", "$togetherWith" ]
}, [ "$member", "$togetherWith" ], [ "$togetherWith", "$member" ] ]
},
"count" : {
"$sum" : 0.5
}
}
}, {
"$set" : {
"count" : {
"$toInt" : "$count"
}
}
} ]
)
我有这样的东西: `
[
{
....
tags : ["A","B"]
},
{
....
tags : ["A","B"]
},
{
....
tags : ["J","K"]
},
{
....
tags : ["A","B","C"]
}
]`
使用聚合框架,我想按数组组合进行分组以获得如下内容:
[
{
_id:["A","B"],
count : 3
},
{
_id:["J","K"],
count : 1
},
{
_id:["A","C"],
count : 1
},
{
_id:["B","C"],
count : 1
},
]
可能吗?提前致谢
您可以使用 unwind
将数组元素分解为单独的文档。
然后你可以对每个求和得到结果。
db.collection.aggregate([
{ $unwind : "$newTags" },
{ $group:
{ "_id" : "$newTags",
"count":{$sum:1}
}
}])
查询
- 对于大小为 1 的每个标签,使其成为
["V"] -> ["V" null]
(如果你不想计算空值的对,你可以在最终结果中过滤掉) - map,对于每个成员,我们和其他成员一起说
例如
["A" "B" "C"]
将与["B" "C"]
组合成“A”, “B”连同["A" "C"]
等(我们算双倍,接下来我们将除以 2) - 展开数组
- 成对分组,但短对
["A" "B"] = ["B" "A"]
- 取 0.5(而不是 1)(就像我们除以 2)
aggregate(
[ {
"$set" : {
"tags" : {
"$cond" : [ {
"$eq" : [ {
"$size" : "$tags"
}, 1 ]
}, {
"$concatArrays" : [ "$tags", [ null ] ]
}, "$tags" ]
}
}
}, {
"$set" : {
"a" : {
"$map" : {
"input" : "$tags",
"in" : {
"member" : "$$t",
"togetherWith" : {
"$setDifference" : [ "$tags", [ "$$t" ] ]
}
},
"as" : "t"
}
}
}
}, {
"$unwind" : {
"path" : "$a"
}
}, {
"$replaceRoot" : {
"newRoot" : "$a"
}
}, {
"$unwind" : {
"path" : "$togetherWith"
}
}, {
"$group" : {
"_id" : {
"$cond" : [ {
"$lt" : [ "$member", "$togetherWith" ]
}, [ "$member", "$togetherWith" ], [ "$togetherWith", "$member" ] ]
},
"count" : {
"$sum" : 0.5
}
}
}, {
"$set" : {
"count" : {
"$toInt" : "$count"
}
}
} ]
)