旧それなりブログの跡地、画像やスタイルやJSなどが壊れてることがあります。

mongo shell のカスタマイズ方法

2014年7月17日

mongo シェルにも、python に対する ipython みたいな拡張シェルないかなー、と思ったら無さそうでした。

調べてゆくと、.mongorc.js で拡張するのが一般的な方法みたいなので、それを調べました。

~/.mongorc.js を置く

ホームディレクトリ直下に .mongorc.js を配置することで、mongo シェル起動直前に実行されるスクリプトを書くことができます。

また、ここで宣言した変数は、シェル内で参照できます。

例えば、以下の様な .mongorc.js を置くと:

print('Hello.');

var f = function(){
  return 123;
};

シェル起動時に Hello. が出力され:

$ mongo
MongoDB shell version: 2.4.3
connecting to: test
Hello.
> 

f 関数が使えます:

> f()
123

DBCollection や DBQuery をプロトタイプ拡張する

DBCollection.prototypeDBQuery.prototype を拡張することで、db.collectioncursor オブジェクト(例えば、findの結果返されるオブジェクト)の拡張が可能です。

例えば、DBCollection の拡張例:

> DBCollection.prototype.foo = 'Foo?'
Foo?
> db.testcoll.foo
Foo?

例えば、DBQuery の拡張例:

> DBQuery.prototype.foo = 'Foo!'
Foo!
> db.testcoll.insert({x:1, y:2})
> db.testcoll.find().foo
Foo!

例えば、こんな風に使ったりとか:

> DBCollection.prototype.pp = function(){ return this.find.apply(this, arguments).pretty(); }
function (){ return this.find.apply(this, arguments).pretty(); }
> db.testcoll.insert({x:1, y:[1, 2]})
> db.testcoll.pp()
{
        "_id" : ObjectId("53c6c2856112dd888eb5ee5a"),
        "x" : 1,
        "y" : [
                1,
                2
        ]
}

参考ライブラリ

この辺のライブラリを参考にしました:

https://github.com/TylerBrock/mongo-hacker
https://github.com/gabrielelana/mongodb-shell-extensions

問題点(1) .mongorc.js はホームディレクトリにしか置けない

.mongorc.js はホームディレクトリ直下にしか置けない、例えば package.json や .git のように、mongo シェルを起動した際に、カレントディレクトリ以下のものを優先して読んでくれる、という仕組みは無い。

プロジェクト毎に .mongorc.js が定義できるなら、単に collection のショートカット変数を作ったりして、雑にプチ便利にすることも出来たのですが、無理。

問題点(2) プロトタイプ拡張したくない

したくない、したくないんですが、プロトタイプ拡張でない場合、ラッパー関数などを作ってもコレクション名を渡す必要があるので全然便利じゃない、むしろ不便極まりない。

普通のJSコード程、気にする必要はないとは思いますけど。

結局

少しも便利になりませんでした。

mongo shell 芸人さん、大募集中です!

追記:

オレオレ .mongorc.js の管理を始めたので、お見せ出来るようなものではないのですがリンク貼っときます。