mBaaSではJavaScript SDKを公開しています。これを使えばWeb APIの設計や認証周りなどを気にすることなくmBaaSのデータを自由に扱えるようになります。
しかしJavaScript SDKだけでは物足りないと感じたり、結果的にクライアント側でのコード量が増えてしまったりしないでしょうか。例えばデータストアの取り扱いについてはごく簡易的な機能しか提供していないためにその後の集計処理などはコードを書かなければなりません。
そこでJavaScript/Node.js向けのNCMBライブラリを拡張するNCMB Extendを作成しました。まだ簡易的な機能しかありませんが、JavaScript SDKの拡張方法含めて紹介します。
データストアに平均値を算出する機能を持たせる
mBaaSのデータストアには集計機能がありません。そのため合計値や平均値を出すためには一度データストアからデータを取り出して、コードで計算を行う必要があります。これを毎回書くのは手間です。
そこで次のようにして平均値を出せるようにしてみました。
require('ncmb-extend'); let NCMB = require('ncmb'); let ncmb = new NCMB(YOUR_APPLICATION_KEY, YOUR_CLIENT_KEY); let Item = ncmb.DataStore('Item'); Item .average(['Integer', 'Integer2']) .then(function(results) { console.log(results.average); // -> { Integer: 142, Integer2: 31 } })
resultsのaverageキーに対して、指定したカラムの平均値を追加します。
実装について
では実装方法について紹介します。これはJavaScript SDKのQueryオブジェクトのprototypeを拡張しています。
let Query = require('ncmb/lib/query'); Query.prototype.average = function(fields) { // 処理 }
このように処理を書くことでデータストアの検索を拡張できます。なお、countのような書き方を行うためにはfetchAllを置き換えなければならないので控えています。averageメソッドの中でfetchAllを実行し、結果を書き換えています。
// 誤った書き方 Item .average(['Integer', 'Integer2']) .fetchAll() // <- こうではありません .then(function(results) { : }) // 正しい書き方 Item .average(['Integer', 'Integer2']) .then(function(results) { : })
average.js を見ればどのようにNCMBを拡張できるかすぐに分かるはずです。データストアで検索した後に汎用的な処理を行っているのであれば、NCMB Extendのようなprototype拡張が便利です。
今後も汎用的な処理について追加していきます。要望があれば Issues · NCMBMania/ncmb-extend に登録してください。