LoginSignup
3

More than 5 years have passed since last update.

蓄積したブラウザ三国志データを使ったMongoDB アグリゲーション2例

Last updated at Posted at 2014-10-20

前回の記事で作っているブラウザ三国志の地図情報データベースを mongoで集計してみます。

さて、ブラウザ三国志。2次元平面上でゲームが展開されてます。
新仕様のサーバでは フィールドサイズ1601*1601、座標表現では(±800,±800)。
以前は(±600,±600)でしたが、今年になって拡大されました。

mongoDB側には、この2563201マスそれぞれに対応しているレコードがあります。

土地タイプ集計

ブラウザ三国志では各マス(土地)の状態が各種あります。
城(ユーザ本拠)、村、砦、領地、NPC砦、空き地 です。
これをタイプ別に集計してみます。

mongo
> db.lands.aggregate([{$group:{_id: "$type", count:{$sum: 1 }}}]);
{ "_id" : "castle", "count" : 18428 }
{ "_id" : "village", "count" : 27460 }
{ "_id" : "fort", "count" : 11329 }
{ "_id" : "territory", "count" : 397602 }
{ "_id" : "npc_fort", "count" : 2653 }
{ "_id" : "vacant_land", "count" : 2105729 }

2014/10/20 11時にこの集計を行いました。
2105729+2653+397602+11329+27460+18428=2563201 という事で、レコード数も一致してます。

castle(城)は参加ユーザ各自に1つずつ割り当てられていますので、すなわちこれがユーザ数です。ゲーム内のランキングページ(2014/10/20 09:00集計)では 18423と表示されていますので、小一時間で5名増えたという事でしょう。

vacant_landが空き地で、全体の82%が未開拓という事です。プロットした図の印象よりもずっと空き地が多い様に感じます。

ゲーム開始でユーザは、城隣接の土地を攻撃して領地(territory)にし、さらにまた隣接地を手に入れてゆくという遠征スタイルで、各地に点在するNPC砦に隣接し、攻城・制圧する事で資源ボーナスを手に入れたりをします。

NPC砦はゲーム開始時から既に存在し、2653個固定です。

NPC砦を攻撃したり、ユーザ(君主)が寄合って作る 同盟 間の戦争等では敵地に拠点(Fort)を作り造兵したり、安全な場所で資源村(Village)を作ったり壊したりします。
拠点が38789個。ユーザあたりでは2.1個持っているという事になりますが、本拠地しか持っていない = アクティブではない君主も多いので平均2.1というのは当てになりません。

所有拠点数集計

という事で、拠点を持っている君主(ユーザ)はどのくらいいるのかを調べます。
拠点は上記の通りfortvillageなので、まず全レコードで土地タイプが該当するものを$matchで抽出し、これをusername毎に$group集計してユーザ毎の拠点数countを得、さらにそのcount毎にユーザ数を集計したものが以下です。

mongo
> db.lands.aggregate([{$match:{$or:[{type:"village"},{type:"fort"}]}},{$group:{_id: "$username", count:{$sum: 1 }}},{$group:{_id:"$count", users:{$sum:1}}}]);
{ "_id" : 1, "users" : 862 }
{ "_id" : 3, "users" : 1230 }
{ "_id" : 4, "users" : 3232 }
{ "_id" : 2, "users" : 857 }
{ "_id" : 6, "users" : 205 }
{ "_id" : 7, "users" : 169 }
{ "_id" : 8, "users" : 299 }
{ "_id" : 5, "users" : 1762 }
{ "_id" : 9, "users" : 718 }

$sortしてませんが…。_idが拠点数、usersが該当ユーザ数です。

全ユーザ数18428 のうち、拠点数 1から最大所有可能数 9までのユーザは9334名居ました。
残りの9094名は本拠城だけで拠点を持たない、おそらく非アクティブな放置ユーザが大多数と、最近入ったばかりで拠点を作れるレベルに達していないユーザが少数含まれると考えられます。ほぼ半数が放置ユーザという事でしょう。もしかしたらコレクションしている武将カードを、毎日3回行われているデュエルという武闘会で鍛えるだけの遊び方をしているのかもしれませんが。

多数派は拠点数4ですので、一般的な遊び方だとゲームスタートの9月4日から7週間程で作れるのが拠点4個という感じだと思います。

…という風に使えます。インデックス無しで素の集計をすると時間が掛るので、頻繁に集計値を利用する場合はインデックスを作るなどした方が良いでしょう。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3