NoSQL数据库MongoDB的日常使用小结(一)

原创 2015年11月20日 18:54:52

MongoDB系列文章主要是本人自己在平时项目中使用MongoDB的一些经验小结,一方面为了留档方便以后的查看,另一方面也希望跟大家多多交流使用心得,一起进步。

本文主要记录在对MongoDB数据库进行数据更新的一些基本操作和方法,如有错误,烦请批评指正。

背景:

  • MongoDB中有160W+数据
  • 需要在每一条数据后面新增一个字段,字段数据不一致

解决方案

备注:所有测试都是在同一台机同样的网络环境下进行。(由于项目环境原因,使用了VPN连接,可能有所影响,但不影响整体的测试结果)

1.update()

一开始没考虑很多,满以为MongoDB的数据更新操作会很快,就直接使用了MongoDB的update函数实现,实现代码如下:(update的一些其他操作这里就不在详细叙述了,如有疑问可参考MongoDB的官网)

//更新查询条件
DBObject updateCondition = new BasicDBObject();
updateCondition.put("numApplication", numApplication);
//更新数据              
DBObject updatedValue = new BasicDBObject();  
updatedValue.put("tags", tags);
//执行更新          
DBObject updateSetValue = new BasicDBObject("$set",updatedValue);
coll.update(updateCondition, updateSetValue);

单条数据更新测试时间如下:

1000条数据更新时间为:6966ms
1000条数据更新时间为:6529ms
1000条数据更新时间为:6607ms
1000条数据更新时间为:6573ms
1000条数据更新时间为:10903ms
1000条数据更新时间为:6524ms
1000条数据更新时间为:6711ms
1000条数据更新时间为:6511ms
1000条数据更新时间为:6615ms
1000条数据更新时间为:6580ms
1000条数据更新时间为:7529ms
.....

做到这里,其实大家可想而知,单条更新的速度其实是奇慢无比的,果不其然,慢的真的是令人发指,160w+的数据更新,粗略算了一下,大概要3个小时。如果每一次更新一下数据都要3个多小时的话,我就只能呵呵哒了呀,此方法明显不可取。

2.bulk.find().upsert().update()

这种批量更新的需求是显而易见的,我也相信MongoDB肯定做过这样的事情了,只不过是本人只是甚少的缘故而已。所以就开始搜寻各种博客、官档探寻数据的批量更新,终于功夫不负有心啊,在博客[1]中看到了批量更新的影子,也就是标题中的bulk方法,于是就去查找关于bulk的一些用法,终于实现了MongoDB数据的批量更新,实现代码如下:(关于bulk的详细方法请参考MongoDB的官档。)

//循环添加更新数据
for(int i=0;;){
    //初始化BulkWriteOperation 
    BulkWriteOperation bulk = coll.initializeOrderedBulkOperation();
    //更新条件
    DBObject updateCondition = new BasicDBObject();
    updateCondition.put("numApplication", numApplication);
    //更新数据          
    DBObject updatedValue = new BasicDBObject();  
    updatedValue.put("tags", tags);
    DBObject updateSetValue = new BasicDBObject("$set",updatedValue);
    //更新累计              
    bulk.find(updateCondition).upsert().updateOne(updateSetValue);
    //批量更新          
    if((++i) % 10000 == 0){
        bulk.execute();
        bulk = coll.initializeOrderedBulkOperation();
        System.out.println("批量更新数据完成");
    }
}

批量数据更新时间测试如下:

1000条数据更新时间为:450ms
1000条数据更新时间为:425ms
1000条数据更新时间为:413ms
1000条数据更新时间为:329ms
1000条数据更新时间为:419ms
1000条数据更新时间为:350ms
1000条数据更新时间为:719ms
1000条数据更新时间为:361ms
1000条数据更新时间为:349ms
1000条数据更新时间为:349ms
1000条数据更新时间为:382ms
1000条数据更新时间为:388ms
1000条数据更新时间为:382ms
1000条数据更新时间为:350ms

看到这里,终于应该感到欣慰了,这个时间相对来说已经提高了将近20倍左右,更新的时间也大大缩减了,大功告成。

待解决的疑问:在批量更新的过程中,一开始整个更新的速度确实是挺快的,但是到了大约60w之后,速度开始有所降低,到底是何原因导致的,还有待进一步的测试和分析。但是总体来说,更新时间还是在可接受的范围之内的。

参考文献

[1] http://stackoverflow.com/questions/30027608/mongodb-slow-update-loop

版权声明:本文为博主原创文章,未经博主允许不得转载。

mongoDB基础篇——NoSQL特性及MongoDB数据查询

在 【MongoDB基础篇——走进非关系型数据库mongoDB】和【MongoDB应用篇——面向集合的数据库操作】中,初步介绍了非关系型数据库MongoDB的基本结构和传统关系型数据库的区别,以及数据...
  • Daybreak1209
  • Daybreak1209
  • 2016年01月11日 11:03
  • 1489

Nosql Mongodb 基本操作说明

成功启动MongoDB后,命令行窗口输入mongo,输入help可以看到基本操作命令: show dbs:显示数据库列表 show collections:显示当前数据库中的集合(类似关系数据库中...
  • yown
  • yown
  • 2016年05月25日 20:03
  • 1365

NoSQL数据库:MongoDB与Hbase的区别

1.Mongodb bson文档型数据库,整个数据都存在磁盘中,hbase是列式数据库,集群部署时每个familycolumn保存在单独的hdfs文件中。 2.Mongodb 主键是“_id”,...
  • chenxiao_ji
  • chenxiao_ji
  • 2016年04月05日 17:56
  • 987

【NoSQL】NoSQL简介及常用的NoSQL数据库对比(Redis、MongoDB、HBase等)

NoSQL(Not Only SQL),泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显...
  • cangchen
  • cangchen
  • 2015年04月02日 11:44
  • 963

MongoDB(一)NoSQL起源

为什么出现NoSQL? 随着互联网的发展,当我们把一台服务器一台服务器变成两台服务器,当我们开始建立数据备份,当我们需要加一个缓冲层,来调整所有的查询,投入更多的硬件。 最后,需要将数据切分多个集群...
  • lovesummerforever
  • lovesummerforever
  • 2014年10月16日 18:10
  • 3014

几款主流 NoSql 数据库的对比

最近小组准备启动一个 node 开源项目,从前端亲和力、大数据下的IO性能、可扩展性几点入手挑选了 NoSql 数据库,但具体使用哪一款产品还需要做一次选型。 我们最终把选项范围缩窄在 HBase、...
  • yzh_2017
  • yzh_2017
  • 2016年12月20日 09:21
  • 1487

5.非关系型数据库(Nosql)之mongodb:创建集合,备份与导入导出, 数据还原,导入导出

1 固定集合 固定集合值得是事先创建而且大小固定的集合 2 固定集合的特征:固定集合很像环形队列,如果空间不足,最早文档就会被删除,为新的文档腾出空间。一般来说,固定集合适用于任何想要自动淘汰过期...
  • toto1297488504
  • toto1297488504
  • 2014年10月16日 00:24
  • 1703

Nosql Mongodb之旅(9)—MongoDB高级查询の存储过程

下面我们将这个sql 自定义函数转换为MongoDB 的存储过程: [plain] view plaincopy > db.system.js.save...
  • abv123456789
  • abv123456789
  • 2014年04月21日 12:46
  • 1409

详解NoSQL数据库使用实例

一、NoSQL基础知识 1.关于NoSQL 在“NoSQL”一词,实际上是一个叫Racker的同事创造的,当约翰埃文斯埃里克要组织一次活动来讨论开源的分布式数据库。这个名称和概念都由此而来...
  • u011225629
  • u011225629
  • 2015年07月24日 22:48
  • 1597

MongoDB学习(一)初识NoSql及MongoDB

1.初识NoSql 1.1关系型数据库           在认识NoSql之前先来简单的了解下什么是关系型数据库。         关系型数据库以行和列的二维表格形式来存储...
  • qq_16313365
  • qq_16313365
  • 2016年08月17日 17:37
  • 6001
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:NoSQL数据库MongoDB的日常使用小结(一)
举报原因:
原因补充:

(最多只允许输入30个字)