【问题标题】:MongoDB group data meltMongoDB组数据融化
【发布时间】:2018-08-13 22:44:55
【问题描述】:

假设我有一个小数据集:

[
    {"A": 0, "B": 0, "X": 100, "Y": 100},
    {"A": 1, "B": 0, "X": 50, "Y": 55},
    {"A": 0, "B": 1, "X": 25, "Y": 30},
    {"A": 1, "B": 1, "X": 1, "Y": 6}
]

我还有一个管道,其中最后阶段是一个组:

[
    {
        "$group": {
            "_id": {
                "classification1": {
                    "$eq": ["$A", 1]
                },
                "classification2": {
                    "$eq": ["$B", 1]
                }
            },
            "countX": {"$sum": "$X"},
            "countY": {"$sum": "$Y"}
        }
    }
]

这个管道的输出:

[
    {"_id": {"classification1": false, "classification2": false}, "countX": 100, "countY": 100},
    {"_id": {"classification1": true, "classification2": false}, "countX": 50, "countY": 55},
    {"_id": {"classification1": false, "classification2": true}, "countX": 25, "countY": 30},
    {"_id": {"classification1": true, "classification2": true}, "countX": 1, "countY": 6}
]

我需要哪些管道步骤才能达到这样的融合格式?

[
    {"name": "classification1", "countX": 51, "countY": 61},
    {"name": "classification2", "countX": 26, "countY": 36}
]

请注意,此转换将前一阶段的文档 1 计数为零次,并将文档 4 计数两次(因为两个条件都为假,或两者都为真)。

我为此编写了一个 Javascript 函数,但是无法从管道调用 Javascript 函数(聚合管道必须是可序列化的)。不幸的是,这意味着我必须从数据库中卸载数据,在数据上运行脚本,然后将转换后的数据作为临时集合重新加载,以在此阶段之后完成管道的其余部分。

非常感谢任何帮助。

【问题讨论】:

    标签: mongodb aggregation-framework


    【解决方案1】:

    我做了一些关于方面的阅读。有点冗长,但这个查询以正确的格式提供了融合数据:

    [
        {
            "$group": {
                "_id": {
                    "classification1": {
                        "$eq": ["$A", 1]
                    },
                    "classification2": {
                        "$eq": ["$B", 1]
                    }
                },
                "countX": {"$sum": "$X"},
                "countY": {"$sum": "$Y"}
            }
        },
        {
            "$facet": {
                "classification1": [
                    {"$match": {"_id.classification1": true}},
                    {"$group": {"_id": null, "X": {"$sum": "$countX"}, "Y": {"$sum": "$countY"}}},
                    {"$addFields": {"name": "classification1"}}
                ],
                "classification2": [
                    {"$match": {"_id.classification2": true}},
                    {"$group": {"_id": null, "X": {"$sum": "$countX"}, "Y": {"$sum": "$countY"}}},
                    {"$addFields": {"name": "classification2"}}
                ]
            }
        },
        {
            "$project": {"combine": {"$setUnion": ["$classification1", "$classification2"]}}
        },
        {
            "$unwind": "$combine"
        },
        {
            "$replaceRoot": {"newRoot": "$combine"}
        },
        {
            "$project": {"_id": 0}
        }
    ]
    

    【讨论】:

      猜你喜欢
      • 2018-09-02
      • 1970-01-01
      • 2016-07-26
      • 1970-01-01
      • 2014-03-08
      • 2021-08-22
      • 1970-01-01
      • 2016-05-10
      • 2018-11-04
      相关资源
      最近更新 更多