Mongodb计数数组中的项目组合
Posted
技术标签:
【中文标题】Mongodb计数数组中的项目组合【英文标题】:Mongodb counting combination of items in array 【发布时间】:2021-11-18 08:37:37 【问题描述】:我有类似的东西: `
[
....
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
,
]
有可能吗?提前致谢
【问题讨论】:
【参考方案1】:查询
对于每个大小为 1 的标签,使其成为["V"] -> ["V" null]
(如果您不想计算带有 null 的对,可以在最终结果中过滤掉)
地图,对于每个成员,我们与其他成员一起说
例如["A" "B" "C"]
将与["B" "C"]
一起构成“A”,
"B" 加上["A" "C"]
等(我们计算双倍,接下来除以 2)
展开该数组
成对分组,但短路对["A" "B"] = ["B" "A"]
计数为 0.5(而不是 1)(就像我们除以 2)
Test code here
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"
]
)
【讨论】:
【参考方案2】:您可以使用unwind
将数组元素拆分为单独的文档。
然后你可以将每个相加得到结果。
db.collection.aggregate([
$unwind : "$newTags" ,
$group:
"_id" : "$newTags",
"count":$sum:1
])
【讨论】:
以上是关于Mongodb计数数组中的项目组合的主要内容,如果未能解决你的问题,请参考以下文章
Meteor / MongoDB - 如何证明数组中的任何项目是不是等于特定值,而不是在“真”的情况下从另一个数组中提取项目?