扩充mongodb shell

因为项目对mongodb数据库的结构做了一点修改,仅仅是是因为添加/删除一列就导致我使用python写了两个小程序来实现这一功能,而这样的功能在MySQL等关系数据库实际就是一条alter table命令的事。事后我就思考有没有简单的方法去实现这一点,一种方法就是用python实现类似MySQL修改数据模式的一套,这涉及到语法解析,并不简单。第二种方法就是扩展mongo shell,既然mongo shell可以运行javascript,就应当可以写javascript来扩充shell,通过mongo --help果然发现发现mongo可以直接运行javascript,并且通过加上--shell参数可以保持当javascript脚本执行完成之后并不退出shell。

要用javascript去扩展shell,首先就得知道shell使用的javascript类型,这并不困难,因为mongodb开源,这里有mongo shell的[url=http://api.mongodb.org/js/index.html]javascript代码[/url],从这里我们可以知道DBCollection代表一个collection,如果我们增加添加/删除列的功能,只需要为DBCollection添加相应的方法就可以了。

DBCollection.prototype.addColumn = function(name, value) {
var cond = {};
cond[name] = { $exists: false };
var field = {};
field[name] = value;
this.update(cond, { '$set': field }, false, true);
}

DBCollection.prototype.dropColumn = function(name) {
var field = {};
field[name] = 1;
this.update({}, {'$unset': field }, false, true);
}


这样,在命令行下输入"mongo --shell mongo.js",然后就可以用db.account.addColumn("is_active", true)来为account collection添加is_active列了。我们也可以将新的方法加入到db.foo.help()中去,免得日后忘记:

_original_help = DBCollection.prototype.help;
DBCollection.prototype.help = function() {
_original_help.apply(this);
var shortName = this.getName();
print("\tdb." + shortName + ".addColumn(name[, value]) - add column if it doesn't exist");
print("\tdb." + shortName + ".dropColumn(name) - remove column");
}


最后每次都要输入"mongo --shell mongo.js"也是很繁琐的事,所以将它作为mongo的alias添加到.bashrc(或者.bash_aliases,如果你也像我一样喜欢将所有alias放在一个单独的文件中)中去就显得很有必要了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值