Node.jsで暗号資産アービトラージ

ビットコイントレード中心にNode.jsで実際に作るためのレシピ

MongoDBでgroup化した列をgroup化する

MongoDBのコマンドリファレンスですの続きです。

前回記事はこちらです。

www.kennejs.com

ちょっと有益なコマンド

複数の項目でgroup化した列を集計する

同じくdb.collection.aggregate()を使用します。
引数に$group: {_id:"$(列名1)","$(列名2)"}のような使い方をします。

サンプルデータ&コード

> db.blogtest.find()
{ "_id" : "title" : "Node.jsでWebサーバ構築", "category" : "Node.js", "access_number" : 1 }
{ "_id" : "title" : "Node.jsでWebサーバ構築", "category" : "Node.js", "access_number" : 3 }
{ "_id" : "title" : "Node.jsでWebサーバ構築", "category" : "Web", "access_number" : 0 }
{ "_id" : "title" : "Node.jsでWebサーバ構築", "category" : "Web", "access_number" : 1 }
{ "_id" : "title" : "MongoDBサンプルコード", "category" : "MongoDB", "access_number" : 1 }
{ "_id" : "title" : "MongoDB構築", "category" : "MongoDB", "access_number" : 5 }
{ "_id" : "title" : "MongoDBサンプルコード", "category" : "MongoDB", "access_number" : 2 }
{ "_id" : "title" : "MongoDBサンプルコード", "category" : "MongoDB", "access_number" : 1 }
>
> db.blogtest.aggregate(
...   { $group :
...     {
...       _id  : {"title": "$title","category": "$category"},
...       "max": {$max : "$access_number" }
...     }
...   });

{ "_id" : { "title" : "MongoDB構築", "category" : "MongoDB" }, "max" : 5 }
{ "_id" : { "title" : "MongoDBサンプルコード", "category" : "MongoDB" }, "max" : 2 }
{ "_id" : { "title" : "Node.jsでWebサーバ構築", "category" : "Web" }, "max" : 1 }
{ "_id" : { "title" : "Node.jsでWebサーバ構築", "category" : "Node.js" }, "max" : 3 }
>

group化した列を集計した結果をさらにgroup化する

ブログ用に抽象化するとなんのためにす

引数に$group: {_id:"$(列名1)","$(列名2)"},$group: {_id:"$(列名1)"},のような使い方をすることで検索結果をgroup化できます。

用途としてはmongodbの関数を使った結果を加工したいときとかです。ここでは日付をsubstrして月を取り出してみます。

(念のため、時刻の処理は適当です。すみません)

サンプルデータ&コード

> db.blogtest.find();
{ "_id" :  "date" : "2019/1/10", "title" : "Node.jsでWebサーバ構築", "category" : "Node.js", "access_number" : 1 }
{ "_id" :  "date" : "2019/1/11", "title" : "Node.jsでWebサーバ構築", "category" : "Node.js", "access_number" : 3 }
{ "_id" :  "date" : "2019/2/12", "title" : "Node.jsでWebサーバ構築", "category" : "Web", "access_number" : 0 }
{ "_id" :  "date" : "2019/1/13", "title" : "Node.jsでWebサーバ構築", "category" : "Web", "access_number" : 1 }
{ "_id" :  "date" : "2019/2/10", "title" : "MongoDBサンプルコード", "category" : "MongoDB", "access_number" : 1 }
{ "_id" :  "date" : "2019/2/11", "title" : "MongoDB構築", "category" : "MongoDB", "access_number" : 5 }
{ "_id" :  "date" : "2019/1/12", "title" : "MongoDBサンプルコード", "category" : "MongoDB", "access_number" : 2 }
{ "_id" :  "date" : "2019/1/13", "title" : "MongoDBサンプルコード", "category" : "MongoDB", "access_number" : 1 }
>
> db.blogtest.aggregate(
...   { $group :
...     {
...       _id  : {"postMonth":{$substr:["$date",5,1]},"title": "$title","category": "$category"},
...       "max": {$max : "$access_number" }
...     }
...   },
...   { $group :
...     {
...       _id  : {"postMonth": "$_id.postMonth","category": "$_id.category"},
...       "average" : { $avg : "$max"}
...     }
...   }
... );
{ "_id" : { "postMonth" : "1", "category" : "Node.js" }, "average" : 3 }
{ "_id" : { "postMonth" : "1", "category" : "Web" }, "average" : 1 }
{ "_id" : { "postMonth" : "2", "category" : "MongoDB" }, "average" : 3 }
{ "_id" : { "postMonth" : "2", "category" : "Web" }, "average" : 0 }
{ "_id" : { "postMonth" : "1", "category" : "MongoDB" }, "average" : 2 }

Queryでエラーが発生した時は

E QUERY    [js] SyntaxError: invalid property id @(shell):7:4

@(shell):7:4に注目しましょう。
7列目の左から4つ目に原因があります。

ブログ用サンプル作成ではまってしまいました。invalid property idといいつつ、括弧が足りてなかったとは。。最初にちゃんと場所特定すればよかった。。

英会話