【问题标题】:Get hierarchical nested data from MongoDB从 MongoDB 获取分层嵌套数据
【发布时间】:2017-05-11 04:57:29
【问题描述】:

我是 MongoDB 的新手。但是,我对一些aggregate 函数/运算符有所了解。

首先,请看一下数据(它包含板球比赛信息):

一个文档(行)如下所示:

{
    "ID": 577,
    "Inning": 1,
    "BattingTeam": "Sunrisers Hyderabad",
    "BowlingTeam": "Royal Challengers Bangalore",
    "Over": 1,
    "Bowler": "S Aravind",
    "Ball": 1,
    "Batsman": "DA Warner",
    "NonStriker": "S Dhawan",
    "TotalRuns": 1
}
...
...

这是整个数据文件: http://raw.sam016.com/shared/match_data.json

那些不懂板球的人(比如我),这里有一些信息:

  • 一场比赛包含 2 局 [1, 2]
  • 每局都有一些过场 [20, 60]
  • 每个以上最多包含 6 个球

我想以这种方式聚合/分组这些数据以获得以下类型的分层结果:

[{
    "ID": 577,
    "Innings": [{
            "Inning": 1,
            "BattingTeam": "Sunrisers Hyderabad",
            "BowlingTeam": "Royal Challengers Bangalore",
            "Overs": [
                {
                    "Over": 1,
                    "Bowler": "S Aravind",
                    "Balls": [
                        {
                            "Ball": 1,
                            "Batsman": "DA Warner",
                            "NonStriker": "S Dhawan",
                            "TotalRuns": 1
                        },
                        {...},
                        {...}
                    ]
                },
                {...},
                {...}
            ]
        },
        {
            "Inning": 2,
            "BattingTeam": "Royal Challengers Bangalore",
            "BowlingTeam": "Sunrisers Hyderabad",
            "Overs": [
                {
                    "Over": 1,
                    "Bowler": "B Kumar",
                    "Balls": [
                        {
                            "Ball": 1,
                            "Batsman": "CH Gayle",
                            "NonStriker": "V Kohli",
                            "TotalRuns": 0
                        },
                        {...},
                        {...}
                    ]
                },
                {...},
                {...}
            ]
        }
    ]
}]

我们将不胜感激。

【问题讨论】:

    标签: mongodb mongoose mongodb-query aggregation-framework


    【解决方案1】:

    您可以尝试以下聚合管道。

    您只需$group 键和$push 数据即可创建每个级别。

    从最内层Balls 开始,一直到Innings

    db.cricket.aggregate({
        $group: {
            "_id": {
                "ID": "$ID",
                "Inning": "$Inning",
                "BattingTeam": "$BattingTeam",
                "BowlingTeam": "$BowlingTeam",
                "Over": "$Over",
                "Bowler": "$Bowler"
            },
            "Balls": {
                $push: {
                    "Ball": "$Ball",
                    "Batsman": "DA Warner",
                    "NonStriker": "S Dhawan",
                    "TotalRuns": "$TotalRuns"
                }
            }
        }
    },
    {
        $group: {
            _id: {
                "ID": "$_id.ID",
                "Inning": "$_id.Inning",
                "BattingTeam": "$_id.BattingTeam",
                "BowlingTeam": "$_id.BowlingTeam"
            },
            "Overs": {
                $push: {
                    "Over": "$_id.Over",
                    "Bowler": "$_id.Bowler",
                    "Balls":"$Balls"
                }
            }
        }
    },
    {
        $group: {
            "_id": "$_id.ID",
            "Innings": {
                $push: {
                    "Inning": "$_id.Inning",
                    "BattingTeam": "$_id.BattingTeam",
                    "BowlingTeam": "$_id.BowlingTeam",
                    "Overs":"$Overs"
                }
            }
        }
    })
    

    【讨论】:

    • 如何排序?我尝试通过 inning>over>ball 添加$sort。但最终结果没有排序。
    • 您必须一次排序一个级别。因此,对于第一级,您需要在推前通过球 $sort。像{$sort:{Ball:1}} 这样的东西在第一个 $group 之前等等。
    • 我在每个$group 之前通过$_id$sort。按$_id排序,会不会对性能有一定影响?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 2016-01-25
    • 2016-08-13
    • 1970-01-01
    • 1970-01-01
    • 2020-01-24
    • 1970-01-01
    相关资源
    最近更新 更多