为MongoDB编写Js维护脚本

最近项目上有一个需求,要对存储在MongoDB中的用户行为数据定期进行统计分析。

先使用PHP实现原型,发现因为数据量很大,大量时间都花在MongoDB服务器和Web服务器之间的数据交换上。考虑到这一点,必须在MongoDB服务器上进行本地计算,将结果保存起来,再使用PHP访问并展示给用户。

查阅文档得知,MongoDB可以执行JS脚本,这样思路就清楚了,用JS脚本实现统计的功能,再用crontab定期执行。

现在和大家分享一下在完成这个任务的过程中,遇到的一些问题和解决思路。(必须要说的是,MongoDB的官方文档对服务器端JS编程的文档极度缺乏,很多命令都是通过Google才找到的。)

在命令行输出信息

输出字符串:

print( 'Hello World' );

输出对象:

var obj = { 'key' : 'value' };
printjson( obj );

切换数据库

在Mongo JS Shell中,切换当前数据库的命令是:use xxx,这是一个magic helper。遗憾的是,在JS脚本中没有use可用。

如果运行mongo时没有加上–nodb参数,那么会自动connect到指定的服务器和数据库,并把句柄保存为db。如果运行时没有指定服务器会默认连接本机127.0.0.1,如果没有指定数据库会连接到test数据库。

你可以用conncet命令重新发起连接:

var userDB = connect( '123.123.123.123/user' );
userDB.user.find();

Continue reading 为MongoDB编写Js维护脚本

在MongoDB的shell中显示服务器当前IP

不久前发生一起严重的事故,误删了生产MongoDB服务器上的一个collection,由于没有定时备份,导致几天的数据丢失。认真反省之后,写下这篇文章,希望能给大家一些警示。

过程

当时我正双开两个终端窗口,分别用mongo连接开发环境和生产环境的MongoDB。由于本地的数据库因为不断的开发测试已经被污染了,我从生产环境dump了最新的数据并下载到本地。接下来要做的是把本地MongoDB中的对应collection给drop掉,然后restore回去。

这时我不知道被什么事情打断了,当我继续这个过程时,由于Mongo Shell中没有像Redis那样显示服务器的IP,我并没有注意到自己点开的是生产服务器的终端,并执行了drop命令……

反省

1、在对生产数据库做删除之类的危险操作时,一定要两个人double check;
2、明确区分生产环境和开发环境,在执行各种删除操作前对所在的环境进行确认;
3、在执行重要操作时,不接受其他事务的打断;

措施

在生产环境和开发环境都建立一个~/.mongorc.js文件,内容如下:

var prompt = function ( ) {
var host = db.getMongo().toString().replace( 'connection to ', '' );
var database = db.getName();
return host + '/' + database + '> ';
}

然后连接到Mongo Shell时就会显示服务器IP了,如:

[zhangshenjia@mac: ~]$mongo
MongoDB shell version: 2.4.4
connecting to: test
127.0.0.1/test>