mongodb - 从 MongoDB 聚合中的数组获取所有可能的组合 🚀

标签 mongodb aggregation-framework match aggregation

如何通过数组中的相同值进行聚合($group)?不是一次性全部,而是少量全部(如果有的话)。我可以通过一个词来完成 $group,但我还需要所有可能的变化...

集合示例:

{"keywords": ["gta", "distribution", "keys"]}
{"keywords": ["gta", "online", "moto", "races"]}
{"keywords": ["gta", "online", "samp"]}

结果示例:

  1. “gta” - 3 场比赛
  2. “在线”- 2 场比赛
  3. “gta online”- 2 场比赛

最佳答案

您可以使用$reduce从数组中提取所有对的组合。我从 this post 开始我已经添加了当前项目 $unwind 初始数组并计算项目数:

db.test.aggregate([
    {
        $project: {
            pairs: {
                $reduce: {
                    input: { $range: [0, { $size: "$keywords" }] },
                    initialValue: [],
                    in: {
                        $concatArrays: [
                            "$$value",
                            [[{ $arrayElemAt: ["$keywords", "$$this"] }]],
                            {
                                $let: {
                                    vars: { i: "$$this" },
                                    in: {
                                        $map: {
                                            input: { $range: [{ $add: [1, "$$i"] }, { $size: "$keywords" }] },
                                            in: [{ $arrayElemAt: ["$keywords", "$$i"] }, { $arrayElemAt: ["$keywords", "$$this"] }]
                                        }
                                    }
                                }
                            }
                        ]
                    }
                }
            }
        }
    }, {
        $unwind: "$pairs"
    }, {
        $group: {
            _id: "$pairs",
            count: { $sum: 1 }
        }
    }
])

输出:

{ "_id" : [ "online", "samp" ], "count" : 1 }
{ "_id" : [ "gta", "samp" ], "count" : 1 }
{ "_id" : [ "online", "races" ], "count" : 1 }
{ "_id" : [ "moto", "races" ], "count" : 1 }
{ "_id" : [ "gta", "keys" ], "count" : 1 }
{ "_id" : [ "races" ], "count" : 1 }
{ "_id" : [ "gta", "distribution" ], "count" : 1 }
{ "_id" : [ "samp" ], "count" : 1 }
{ "_id" : [ "distribution", "keys" ], "count" : 1 }
{ "_id" : [ "gta" ], "count" : 3 }
{ "_id" : [ "online" ], "count" : 2 }
{ "_id" : [ "keys" ], "count" : 1 }
{ "_id" : [ "gta", "online" ], "count" : 2 }
{ "_id" : [ "moto" ], "count" : 1 }
{ "_id" : [ "online", "moto" ], "count" : 1 }
{ "_id" : [ "distribution" ], "count" : 1 }
{ "_id" : [ "gta", "moto" ], "count" : 1 }
{ "_id" : [ "gta", "races" ], "count" : 1 }

如果您需要更多组合,您可能需要更新上面的$reduce阶段

关于mongodb - 从 MongoDB 聚合中的数组获取所有可能的组合 🚀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64812637/

相关文章:

php - 如何从特定 MongoDB 文档中的对象数组中获取特定对象?

mongodb - 如何显示最大编号的客户名称MongoDB 中的订单?

mongodb - mgo/mongodb : aggregate - find all and order by membercount however membercount is an array of member userids

javascript - 检查 localStorage 项目是否与字符串匹配

javascript - Mongodb递归搜索

mongodb - 每 20 分钟到 2 小时体验一次 Mongo::OperationTimeout

node.js - 从另一个基于 _id 的集合中获取信息并合并 - MongoDB

javascript - 当正则表达式匹配空字符串时,是否可以用 regexp.exec 循环模拟 string.match?

Java正则表达式匹配包含特殊字符的整个单词

javascript - 快速中间件的正确使用方法?