Mongonb按json结构中的元素分组

时间:2017-05-07 10:12:55

标签: json mongodb scala

我正在寻找一个符合我需求的数据库,我正在用mongodb进行测试,但我不知道我是否能够做到我想要的。

我的mongodb集合上有一个像这样的json文档:

{
    "gameId": 1,
    "gameDuration": 1234,
    "teams": [{
        "teamId": 1,
        "win": true
    }, {
        "teamId": 2,
        "win": false
    }],
    "players": [{
        "playerId": 1,
        "teamId": 1,
        "age": 32
    }, {
        "playerId": 2,
        "teamId": 2,
        "age": 52
    }]
}

所以我有一系列看起来像这样的游戏。 我希望能够查询最常见的玩家年龄,或者将年龄排序。我不在乎玩家是否在两个不同的游戏中,我只想让所有游戏中最常见的年龄独立于玩家和团队。

所以,如果我有4场比赛:

[{
        "gameId": 1,
        "gameDuration": 1234,
        "teams": [{
            "teamId": 1,
            "win": true
        }, {
            "teamId": 2,
            "win": false
        }],
        "players": [{
            "playerId": 1,
            "teamId": 1,
            "years": 32
        }, {
            "playerId": 2,
            "teamId": 2,
            "years": 52
        }]
    },
    {
        "gameId": 2,
        "gameDuration": 1234,
        "teams": [{
            "teamId": 1,
            "win": true
        }, {
            "teamId": 2,
            "win": false
        }],
        "players": [{
            "playerId": 1,
            "teamId": 1,
            "years": 25
        }, {
            "playerId": 2,
            "teamId": 2,
            "years": 23
        }]
    },
    {
        "gameId": 3,
        "gameDuration": 1234,
        "teams": [{
            "teamId": 1,
            "win": true
        }, {
            "teamId": 2,
            "win": false
        }],
        "players": [{
            "playerId": 1,
            "teamId": 1,
            "years": 32
        }, {
            "playerId": 2,
            "teamId": 2,
            "years": 23
        }]
    },
    {
        "gameId": 4,
        "gameDuration": 1234,
        "teams": [{
            "teamId": 1,
            "win": true
        }, {
            "teamId": 2,
            "win": false
        }],
        "players": [{
            "playerId": 1,
            "teamId": 1,
            "years": 32
        }, {
            "playerId": 2,
            "teamId": 2,
            "years": 27
        }]
    }
]

排序年龄的结果应为:[32, 23, 52, 25, 27]或最常见的年龄应为32 或者获得每个年龄的计数会很棒。 [{"32": 3}, {"23": 2}, {"25": 1}, {"27": 1}]

我有搜索但无法找到执行此查询的方法。 我不得不说这个数据库会有很多游戏,数百万,所以我想知道如何进行查询会影响性能。我不想要200毫秒的查询,但我也不想要1小时的查询。

我使用mongodb-scala-conector来执行查询,但它可以使用任何语言,然后我可以尝试解析我的需求。

我查看了其他数据库来执行此操作,但由于mongodb让我直接插入json,这是我的第一个选择。但如果它不能满足我的需求,我也会寻找Apache Cassandra,如果不合适,我会选择关系数据库,将json解析为已定义的表。

1 个答案:

答案 0 :(得分:1)

您可以检查以下聚合是否满足您的需求:

db.games.aggregate([{$unwind:"$players"}, {$group:{_id:"$players.years", count:{$sum:1}}}, {$sort:{count:-1}}])

或者:

db.games.aggregate([{$unwind:"$players"}, {$group:{_id:"$players.years", count:{$sum:1}}}, {$sort:{count:-1}}, {$limit:1}])