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)

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