2017-05-07 15 views
0

私は自分のニーズに合ったデータベースを探していますが、私はmongodbでテストを行っていましたが、私が望むことを実行できるかどうかはわかりません。Mongodbグループ要素内のjson構造

私は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 
    }] 
} 

だから私はこのように見えるゲームのコレクションを持っています。 私は、プレイヤーの最も一般的な年齢を問い合わせたり、年齢をソートしたりできます。プレーヤーが2種類のゲームに参加しているかどうかは気にしません。私はすべてのゲームの最も一般的な年齢をプレーヤーとチームから独立させたいだけです。

私は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}]

私は検索しましたが、このクエリを実行する方法が見つかりませんでした。 私はこのデータベースには数百万のゲームがたくさんあると言わなければならないので、これを行うためのクエリがどのようにパフォーマンスに影響するのか知りたい。私は200msのクエリを望んでいませんが、私も1時間のクエリをしたくありません。

私はmongodb-scala-conectorを使用してクエリを実行していますが、どの言語でも構いませんが、私のニーズに合わせて解析することができます。

私はこれを行うために他のデータベースを調べましたが、mongodbはjsonを直接挿入できるため、これが私の最初の選択でした。しかし、私のニーズに合っていなければ、私もApache Cassandraを探して、それが適合しなければ、jsonを定義されたテーブルに解析するリレーショナルデータベースに行きます。次の集約は何が必要提供する場合

答えて

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}]) 
+0

をうわー、それが動作します。 2つのクエリの動作。どうもありがとう! – Raxkin