JS创建MongoDB测试数据(一)

JS创建MongoDB测试数据(一)

大致需求:

模拟1万个设备,ID号从1到10000;
每个设备有一个档案,包括设备ID、手机号、车牌号、驾驶员;
100个设备组成一组,同组设备具有相同的档案;
每个设备有10万条数据,每条数据包括设备ID、油耗、里程、温度、速度,时间。

用到的工具

MongoDB Server
MongoChef 一个很好用的MongoDB客户端
Notepad++ 用来编辑JS代码

小总结

插入大量数据要用insertMany函数,insert函数会非常慢,即使用了批量插入也还是比较慢,插入1000万条数据用了将近20分钟,如果按原计划10亿条,那要用掉差不多1天半,所以还有很大优化空间。

源代码

运行方法:mongo shell支持js脚本,所以可以直接跑。MongoChef连上数据库,打开IntelliShell,把代码复制粘贴过去,点击运行即可。也可以保存为.js文件,IntelliShell中打开文件,点击运行。

//生成随机手机号
function getRandPhone(){
    var heads = ["134","138","139","150","151","152","157","158","159","170","189"];
    var phone = heads[Math.floor(Math.random()*heads.length)];
    var numbers = [1,2,3,4,5,6,7,8,9];
    for(var i=0; i<8; i++){
        phone+=numbers[Math.floor(Math.random()*numbers.length)];
    }
    return phone;
}

//生成车牌号
function getRandPlate(){
    //地区,用于生成车牌号
    var loc = ["川","渝","贵","陕","京","沪","粤","津","赣","湘","鄂"];
    //字母,用于生成车牌号
    var chars = ["A","B","C","D"];
    //数字,用于生成车牌号
    var numbers = [1,2,3,4,5,6,7,8,9];
    var plate = "";
    plate += loc[Math.floor(Math.random()*loc.length)]; //第一位地区简称
    plate += chars[Math.floor(Math.random()*chars.length)]; //第二位字母简称
    //4位数字
    for(var i=0; i<4; i++){
        plate+=numbers[Math.floor(Math.random()*numbers.length)];
    }
    return plate;
}

//生成名字
function getRandName(){
    var familyNames = ["赵",  "钱",  "孙",  "李",  "周",  "吴",  "郑",  "王",  "冯",  "陈",  
        "褚",  "卫",  "蒋",  "沈",  "韩",  "杨",  "朱",  "秦",  "尤",  "许",
        "何",  "吕",  "施",  "张",  "孔",  "曹",  "严",  "华",  "金",  "魏",  
        "陶",  "姜",  "戚",  "谢",  "邹",  "喻",  "柏",  "水",  "窦",  "章",
        "云",  "苏",  "潘",  "葛",  "奚",  "范",  "彭",  "郎",  "鲁",  "韦",  
        "昌",  "马",  "苗",  "凤",  "花",  "方",  "俞",  "任",  "袁",  "柳",
        "酆",  "鲍",  "史",  "唐",  "费",  "廉",  "岑",  "薛",  "雷",  "贺",  
        "倪",  "汤",  "滕",  "殷",  "罗",  "毕",  "郝",  "邬",  "安",  "常",
        "乐",  "于",  "时",  "傅",  "皮",  "卞",  "齐",  "康",  "伍",  "余",  
        "元",  "卜",  "顾",  "孟",  "平",  "黄",  "和",  "穆",  "萧",  "尹"
        ];
    var givenNames = ["子璇", "淼", "国栋", "夫子", "瑞堂", "甜", "敏", "尚", "国贤", "贺祥", "晨涛", 
        "昊轩", "易轩", "益辰", "益帆", "益冉", "瑾春", "瑾昆", "春齐", "杨", "文昊", 
        "东东", "雄霖", "浩晨", "熙涵", "溶溶", "冰枫", "欣欣", "宜豪", "欣慧", "建政", 
        "美欣", "淑慧", "文轩", "文杰", "欣源", "忠林", "榕润", "欣汝", "慧嘉", "新建", 
        "建林", "亦菲", "林", "冰洁", "佳欣", "涵涵", "禹辰", "淳美", "泽惠", "伟洋", 
        "涵越", "润丽", "翔", "淑华", "晶莹", "凌晶", "苒溪", "雨涵", "嘉怡", "佳毅", 
        "子辰", "佳琪", "紫轩", "瑞辰", "昕蕊", "萌", "明远", "欣宜", "泽远", "欣怡", 
        "佳怡", "佳惠", "晨茜", "晨璐", "运昊", "汝鑫", "淑君", "晶滢", "润莎", "榕汕", 
        "佳钰", "佳玉", "晓庆", "一鸣", "语晨", "添池", "添昊", "雨泽", "雅晗", "雅涵", 
        "清妍", "诗悦", "嘉乐", "晨涵", "天赫", "玥傲", "佳昊", "天昊", "萌萌", "若萌",
        "泽民", "国强", "胜利", "小凡", "碧瑶", "书书", "京雨", "卫东", "小佳", "长江"
        ];
    var name = familyNames[Math.floor(Math.random()*familyNames.length)];
    name+=givenNames[Math.floor(Math.random()*givenNames.length)];
    return name;
}

//var plate =  getRandPlate();
//print(plate);

//var phone = getRandPhone();
//print(phone);

//var name = getRandName();
//print(name);

/**生成油耗
*@param base 油耗基准值
*/
function getFuelConsum(base){
    var trueRange = [base-2, base+2]; //假定偏离基准不超过2
    var fuelConsum = Math.random()*(trueRange[1]-trueRange[0]);
    fuelConsum += trueRange[0];
    return Math.round(fuelConsum*100)/100; //转成2位小数
}

/**生成设备数据
* @param devNum 设备数量
* @param groupNum 每组设备的数量,同一组设备的档案相同
* @param dataNum 每个设备的数据数量
*/
function genDeviceData(devNum,groupNum,dataNum){
    use test;
    for(var i=0; i<devNum/groupNum; i++){
        var devDocs = new Array();
        var phone = getRandPhone();
        var plate =  getRandPlate();
        var driver = getRandName();
        for(var l=1; l<=groupNum; l++) {
            //生成档案
            var deviceId = (l+ i*groupNum).toString();
            devDocs[l-1]= {"deviceId":deviceId,"phone":phone,"plate":plate,"driver":driver};
            //设置基准
            var range = [5,15]; //油耗范围
            var base = range[0] + Math.round(Math.random()*(range[1]-range[0])); //油耗基准值
            var rangeM = [5000,200000]; //行驶里程范围
            var baseM = rangeM[0] + Math.round(Math.random()*(rangeM[1]-rangeM[0])); //里程基准值
            var rangeT = [5,100];//温度范围
            var rangeS = [0,200];//速度范围
            var now = Date.parse(new Date());//1970.1.1至今的毫秒数
            //随机取一个时间作为基准
            var timeBase = Math.round(Math.random()*now);
            //生成数据,每次批量插入100条
            for(var j=0; j<dataNum/100; j++){
                var docs = new Array();
                for(var k=0; k<100; k++) {
                    var fuelConsum = getFuelConsum(base);
                    var mileage = baseM+j*100+k; //每次递增1
                    var temperature = Math.random()*(rangeT[1]-rangeT[0]);
                    temperature = Math.round(temperature*10)/10; //转成1位小数
                    var speed = Math.random()*(rangeS[1]-rangeS[0]);
                    speed = Math.round(speed); //转成整数
                    var timestamp = timeBase+60*(100*j+k);//每次递增60秒
                    docs[k] = {"deviceId":deviceId,"fuelConsum":fuelConsum,"mileage":mileage,"temperature":temperature,"speed":speed,"timestamp":timestamp};
                }
                db.data.insertMany(docs);
            }
        }
        db.archive.insertMany(devDocs);
    }
}

//1000个设备,每组10个,每个设备1万条数据
genDeviceData(1000,10,10000);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容

  • MongoDB 一. MongoDB 介绍: MongoDB是一个跨平台,面向文档的数据库,高性能,高可用性和易于...
    tomzhangto阅读 3,305评论 0 21
  • 很多人从我身边走过 无人所视 无人所爱 就连阳光 也吝啬得理所当然 于是我肆意地 爬进每个人的心里 成了那 点点恶泉
    Meteor620阅读 410评论 0 2
  • 基础法语 1 所有动词变位 2 单词 3 课文以及课后句子 4 语法 法语听说 1 多读课文 2 单词 3 场景对...
    monamour6阅读 84评论 0 0
  • Markdown是一种标记语言,可以与HTML互相转换。可用于网页展示,便于排版。支持Markdown编辑的网站会...
    RookieD阅读 817评论 0 1