现在的位置: 首页 > 综合 > 正文

MongDB shell 脚本学习

2014年03月24日 ⁄ 综合 ⁄ 共 2366字 ⁄ 字号 评论关闭
   刚开始接触MongDB  shell。这里记录一下学习的过程。

  在控制台打开shell .

 linux 环境下:/usr/local/mongo/bin/mongo  

window 环境下:D:\MongoDB\mongodb-win32-i386-2.0.6\bin>mongo

基础部分可以参考:http://www.cnblogs.com/anan/archive/2012/06/15/2550553.html

首先创建一个js function

function query() {
print("开始执行--------------");
//查询一个表video_encode
var encode_coll=db.video_encode.find({status:{"$lt":10}});
print(encode_coll.count());//打印个数
//循环变量
while(encode_coll.hasNext()){
var v=encode_coll.next();
print(v.name);//打印属性
}
print("结束执行--------------");
}

直接调用 query() 方法执行。  如下图

这个函数主要用于 根据条件从一个表中查询 记录 ,然后将记录  循环遍历 打印。

备注刚开始学习的时候遇到这样一个疑问。

在获得一个集合我怎么 知道如何操作这个集合  例如 var encode_coll=db.video_encode.find();

如何知道这个对象。

其实 你可以通过遍历对象 知道他的内部结构。

例如 :

for(var param in encode_coll){

print(param);

你将看到如图 这个是返回游标的属性:

很显然这个是有mongDB 内部对db.find() 返回对象的封装,以便我们更好的操作。

下面来做一个示例:

我有两张表:video_uplaod(uploadId,size) , transcode_job (id,uploadId,act)

我要统计act ="CLOUD" 所有的文件的大小。

思路先根据 act ="CLOUD"  从表transcode_job 中查出所有的uploadIds (Array).

在根据uploadIds 从表video_upload 统计所有的大小。

如图:

//统计转码失败率

function fun_encode_fail(){
//统计时间段,转码失败率
	var b_time=new Date(2012,05,01); //2012-06-01
	var e_time=new Date(2012,06,01);//2012-02-01
	var temp_time=new Date(2012,05,01);//临时时间
	b_time.setDate(b_time.getDate()+7); //添加七天
//循环添加日期
    var weeks=0;

//统计指定时间类,转码失败率
	function failRate(startTime,endTime) {
	print("startTime:"+startTime+" endTime:"+endTime);
		var count=0;//转码个数
		var retryTimes=0;//失败次数
		var fail_rate=0;//失败率
//query 是查询条件,是json 对象
		var query={"status":{"$in":[20,30,70,-100,-101,-200]},"createTime":{"$gt":startTime,"$lte":endTime}};
		var cusor_encode=db.video_encode.find(query);
		var cusor_history=db.video_encode_history.find(query);
//循环cusor_encode
		while(cusor_encode.hasNext()){
			  var video=cusor_encode.next();
			  if(video.retryTimes>0){
			  retryTimes+=video.retryTimes;
			  }
			  count++;
			}
//循环cusor_history
		while(cusor_history.hasNext()){
			  var video=cusor_history.next();
			  if(video.retryTimes>0){
			  retryTimes+=video.retryTimes;
			  }
			  count++;
			}
	   
		fail_rate=count+retryTimes==0?0:retryTimes/(count+retryTimes);
		print("转码数量:"+count);
		print("失败次数:"+retryTimes);
		print("失败率:"+fail_rate);
		var fail_rate_json={"week":weeks,"startTime":startTime,"endTime":endTime,"transcodeNums":count,"failTimes":retryTimes,"failRate":fail_rate};
		db.fail_rate_info.insert(fail_rate_json);
	}
	
//初始化表fail_rate_info
	db.fail_rate_info.remove();
	while(b_time<e_time){
		print("第"+(++weeks)+"周");
		failRate(temp_time.getTime(),b_time.getTime()); //函数需要提前声明
		temp_time.setDate(temp_time.getDate()+7);
		b_time.setDate(b_time.getDate()+7);
	}
}

【上篇】
【下篇】

抱歉!评论已关闭.