简单问题-Sequoiadb数据库脚本批量删除数据

背景

开发中使用的是巨杉数据库,有一个日志集合是按天存储的,即表集合名称规则一致MyLogData_yyyyMMDD的格式,每天生成一张表。现在有一个问题就是服务器磁盘空间已经被撑满了,需要删掉一段时间的数据。由于涉及的类似结构的表有5张,手动一条条执行dropCL操作太麻烦。

解决办法

首先,sequoiadb数据库提供了执行js的工具脚本,可以将需要执行的一堆操作写入到一个脚本中,通过脚本来执行删除操作。完全用js的语法,内容很简单,就是定义一个数组,存储需要删除的集合的日期,然后for循环调用dropCL方法删表。

编写remove_data.js脚本如下,并将其上传到目标服务器home目录下。

var db=new Sdb('localhost',11810)
//定义删除0524-0614日期区间的数据
var removeDates = new Array();
for(var i=24;i<32;i++){
    var date = '201705'+i+'';
    removeDates.push(date);
}

for(var i=1;i<15;i++){
    var date = '201706';
    if(i>9){
        date=date+i+'';
    }else{
         date=date+'0'+i;
    }

    removeDates.push(date);
}

//循环调用sequoiadb的dropCL命令
for(var i=0;itry{
        db.MySpace.dropCL('MyLogData_'+removeDates[i]);
    }catch(e){
        println(e);
    }   

    try{
        db.MySpace.dropCL('MyLogData1_'+removeDates[i]);
    }catch(e){
        println(e);
    }      
}

其次,调用命令执行该脚本:

/opt/sequoiadb/bin/sdb -f /home/remove_data.js

延伸思考

首先,js脚本编写需要注意异常捕获问题,for循环中如果有一个集合不存在,脚本执行就会终结,所以将每个dropCL语句放在try-catch中就能保证所有循环都执行。

其次,其实我想能不能利用db.listCollections获取所有的集合,并用循环打印每条集合的记录的总数。这个遍历操作现在还没有实现。还需要研究下Sequoiadb是怎么跟js的语法联系起来综合运用的,官方说就是标准的js语法,但是从我实践的结果来看还是有差异的,比如这个catch(e)的属性跟js的异常对象就不一样。也没有alert和console.log方法,只找到一个println方法。

最后,这个用脚本执行批量sequoiadb命令的功能还是挺好用的,脚本可复用,而且又不用手动重复执行。

扩展运用

刚刚通过官网管理员的提示,终于知道了sequoiadb数据库的命令操作的返回值的类型了,db.listCollections返回的是游标,只能通过游标来遍历,那么我希望打印每个集合总记录数的脚本就能实现了,修正如下:

var db=new Sdb('localhost',11810)
var cursor = db.listCollections();

while (cursor.next ()){
    var obj = cursor.current ().toObj();
    var realName = obj['Name'];
    var indexOf = realName.indexOf(".");
    var space = realName.substring(0,indexOf);
    var cl = realName.substring(indexOf+1);
    var count = db.getCS(space).getCL(cl).count();
    println(obj['Name']+",count:"+count);
}

截取到space和collection的名称后,再调用函数先获取Space,再获取Collections就能直接获取每个集合的count值了。其实也不复杂,就是js语法的运用了。
结果如下:

简单问题-Sequoiadb数据库脚本批量删除数据_第1张图片

你可能感兴趣的:(项目开发)