ぽっちぽちにしてやんよ

技術ネタとかアプリに関する話とか

MongoDBのShellを使いやすくする方法

最近DBはMongoDBしか使ってないぽちです,おはようございます!

Node.js + MongoDBの組み合わせで使うことがほとんどなので,スクリプトからはmongooseを使うのですが,ちょっとDBの中身を確認したりするのでmongodbのshellを使うことも多いです.

普段mongooseを使っていると,mongodbのshellが貧弱で困ることがあります.

1
2
> db.users.findOne({_id:"<存在するObjectId>"})
null

みたいな.

正しくはこう書かねばなりません.

1
2
3
4
5
> db.users.findOne({_id:ObjectId("<存在するObjectId>")})
{
  "_id":ObjectId("<存在するObjectId>")
  :
}

めんどくさい!ObjectIdと毎回タイプするのがめんどくさい!

1
> db.users.findOneById("<存在するObjectId>")

と書ければ楽だなーと思って探したら,

1
> DBCollection.prototype.findOneById = function(id){return this.findOne({_id:ObjectId(id)});};

とかやってあげると

1
2
3
4
5
db.users.findOneById("<存在するObjectId>")
{
  "_id":ObjectId("<存在するObjectId>")
  :
}

楽ちんだ!

findOneByIdとか長い!

1
2
3
4
5
6
> DBCollection.prototype.findOneById = DBCollection.prototype.fbi = function(id){return this.findOne({_id:ObjectId(id)});};
db.users.fbi("<存在するObjectId>")
{
  "_id":ObjectId("<存在するObjectId>")
  :
}

楽ちんだ!!!!さすがFBI!!!連邦捜査局!!!

はい,でもこれを毎回打つのが超めんどくさい.

そういう時は,~/.mongorc.jsを配置しましょう.

1
2
3
4
5
6
7
$ echo "DBCollection.prototype.findOneById = DBCollection.prototype.fbi = function(id){return this.findOne({_id:ObjectId(id)});};" > ~/.mongorc.js
$ mongo hoge
> db.users.fbi("<存在するObjectId>")
{
  "_id":ObjectId("<存在するObjectId>")
  :
}

楽ちん!

上ではfindOneByIdだけですが,どんどん追加できるので,決まったaggregateがあるならパラメータを渡す簡単構文でaggregateしたりmongooseでいうpopulate的な動作も出来ると思います.

meshというmongo shellに色々ライブラリを読み込んでくれるのもあるのですが,欲しいのがなかったので自分で作って公開するといいよ!

まとめ

  • ~/.mongorc.jsにmongo shellを拡張するスクリプトを置くと便利!

Comments