mongodb技术文摘本书由涛声书友电子书平台制作发行,网站:的技术话题,内容整理自互联网博客,由jamiesun制作发布日期:2011-07-18目录1.白话MongoDB(一)2.白话MongoDB(二)3.白话MongoDB(三)4.[译]NoSQL生态系统5.MongoDB:下一代MySQL?6.10gen工程师讲数据库索引实现7.MongoDB入门教程8.MongoDBTailableCursors特性介绍9.MongoDBRESTApi介绍10.mongodbprotocol分析11.MongoDBReplicaSets简明搭建教程12.MongoDatabaseProfiler13.MongoDB文档阅读笔记——优雅的NoSQL14.MongoDB的备份方式15.在MongoDB中实现乐观并发控制16.几个有趣的NoSQL漫画17.MongoDB数据缓存刷新机制18.MongoDB与TokyoTyrant性能比较(1):基础CRU操作19.MongoDB与TokyoTyrant性能比较(2):并发写入操作20.安全警示,一个简单的MongoDB注入21.MongoDB索引数据类型优化,节省60%内存22.在Django中使用MongoDB23.说说MongoDB的ObjectId••••••1.白话MongoDB(一)作者:NinGoo|【转载须以超链接形式标明文章原始出处和作者信息】按照官方的说法,MongoDB是一种可扩展的高性能的开源的面向文档(document-oriented)的数据库,采用C++开发。注意mongo不是mango(芒果),这个词是从humongous中截取出来的,其野心不言而明,直指海量数据存储。和其他很多NoSQL不太一样,MongoDB背后有一个专门的商业公司在提供支持和推广,有点类似MySQLAB的模式。这一系列文章,是为入门者写的,已经对NoSQL和MongoDB有一定研究和经验的,可以略过,或者看看如有疏漏,请留言指出。面向文档,那么什么是文档呢?很明显这不是我们常见的word文档。这里说的文档,是一种可以嵌套的数据集合。从关系数据库的范式的概念来说,嵌套是明显的反范式设计。范式设计的好处是消除了依赖,但是增加了关联,查询需要通过关联两张或者多张表来获得所需要的全部数据,但是更改操作是原子的,只需要修改一个地方即可。反范式则是增加了数据冗余来提升查询性能,但更新操作可能需要更新冗余的多处数据,需要注意一致性的问题。一个典型的例子,如blog,关系数据库中一般可以把文章设计为一张表,评论设计为一张表,那么在页面需要展示一篇文章和其对应的评论的时候,就需要关联查询文章表和评论表。但是面向文档的设计,可以将评论作为文章的一个嵌套文档存放在一起,这不但省去了关联查询,由于存储在一起,查询的性能也可以做到更好。MongoDB的面向文档采用的是BSON,一种类似JSON的格式,但是是二进制序列化的。如上面提到的blog的文章和评论,可以做如下设计:{'id':1,'author':'NinGoo','title':'白话MongoDB(一)','content':'按照官方的说法,此处省略一万字',comment:[{'comment-author':'宋兵甲','comment-content':'有木有'},{'comment-author':'尼玛','comment-content':'伤不起啊'}]}1.相关数据存放在一起,针对性的查询可以消除join,性能比分散存储要高且方便。2.整个结构清晰自解析。所有字段名和值都存储,所以不需要提前设计结构,key的名字和数目可以任意指定,也就是所谓的schema-free。3.由于字段名在每一行每一列都需要重复存在,会带来一些额外的存储消耗,这在海量数据及字段较多的时候也需要考虑。4.一个document的长度有限,1.7.2之前是4MB,目前是8MB,以后可能增长到32MB。如果有更大的数据,可以使用MongoDB底层的GridFS直接作为文件存储。5.如果需要查找某个评论者的所有评论,则相对困难。当然,MongoDB支持任意key的索引,这也不是什么大问题。像上面的一个结构,为一个文档(document),相当于关系数据库中的一行记录,多个文档组成一个集合(collection),相当于关系数据库的表。多个集合(collection),逻辑上组织在一起,就是数据库(database),一个MongoDB实例支持多个数据库(database)。大部分的NoSQL产品,为追求性能,一致性等,一般只能支持简单的基于row-key的单条或者范围查询,但是MongoDB可以针对任意列的key创建索引,甚至是内嵌文档里的key,从支持的查询的灵活性上来看,更接近传统的关系数据库,同时还能在性能上向NoSQL看齐,加上支持复制,自动分片和Map/Reduce等功能,非常的吸引眼球,正在成为一款热门的海量存储产品。其背后的商业支持公司10gen,也正在不遗余力的推广,前不久还在北京专门组织了一场技术交流会。在其首页列举的典型客户里,包括foursquare,sourceforge,github等知名互联网公司和应用,当然,也包括淘宝网。••••••••••••••••••••••••2.白话MongoDB(二)作者:NinGoo|【转载须以超链接形式标明文章原始出处和作者信息】前面扯了一堆,要了解一个东西,最好的办法,还是让他跑起来,然后结合文档和测试,来验证其实现,并且了解其不足和优点。MongoDB提供了部分系统的编译版本,但从研究学习以及线上不同依赖包的稳定性的目标,个人还是比较推荐从源代码编译安装的方式。MongoDB的源代码依赖了一些基础组件,如js引擎SpiderMonkey,正则表达式引擎PCRE,安装构建工具Scons,以及C++的boost库等,因此编译还是有些麻烦的,realzyy的这篇文章已经比较详细的说明了编译的步骤,主要基于Redhat系统。在ubuntu上安装,还有几个注意点:1.PCRE最好在编译的时候显式指明对UTF-8的支持$configure--enable-unicode-properties$sudomake-j2&&makeinstallPCRE如果不支持UTF-8,则MongoDB无法启动ThuMar3117:27:16Assertion:10342:pcrenotcompiledwithutf8support0x81695280x81e704e0x84502120xb73b6ce70x80f5b11./mongod(_ZN5mongo11msgassertedEiPKc+0x208)[0x8169528]./mongod(_ZN5mongo6RXTest3runEv+0x3fe)[0x81e704e]./mongod(main+0x3832)[0x8450212]/lib/libc.so.6(__libc_start_main+0xe7)[0xb73b6ce7]./mongod()[0x80f5b11]2.Ubuntu自身带了一个SpiderMonkey,但版本有些老,有些MongoDB需要的特性不支持,需要先卸载$dpkg-l|grepxulrunner$sudoapt-getremovexulrunner-1.9.2-devxulrunner-1.9.2$exportCFLAGS=”-DJS_C_STRINGS_ARE_UTF8″$sudomake-fMakefile.ref$sudoJS_DIST=/usrmake-fMakefile.refexport3.需要安装boost等库的支持$sudoapt-get-yinstalltcshgit-coresconsg++$sudoapt-get-yinstalllibpcre++-devlibboost-devlibreadline-devxulrunner-dev$sudoapt-get-yinstalllibboost-program-options-dev\libboost-thread-devlibboost-filesystem-devlibboost-date-time-dev4.源代码建议从github上下载,根据需要编译相应的版本$gitclonegit://github.com/mongodb/mongo.git$cdmongo••••••••••••••••••••$gittag-l$gitcheckoutr1.8.05.最后,编译安装MongoDB的时候,建议连带头文件和库文件一起$scons-j2all$scons--prefix=/opt/mongo--fullinstall另外,MongoDB也可以使用GoogleV8来作为js引擎,从性能方面来说,V8可能是更好的选择,从jira来看,MongoDB在未来或许会改用v8作为默认引擎。首先编译V8,然后编译MongoDB的时候使用userv8参数:$svncheckout*/usr/include/$cdmongodb-src$sconsall--usev8$scons--prefix=/opt/mongo--fullinstallMongoDB在32位环境下有诸多限制,只能用于学习研究的目的,线上环境一定要使用64位系统。ThuMar3117:24:58--oplogSizeof1024MBistoobigfor32bitversion.Use64bitbuildinstead.参考:://://://jira.mongodb.org/browse/SERVER-446•••••••••••••••••••3.白话MongoDB(三)作者:NinGoo|【转载须以超链接形式标明文章原始出处和作者信息】通过源代码编译安装好MongoDB之后,接下来需要配置运行。在MongoDB的安装目录,有几个子目录,bin下面是可执行文件,包括mongod:数据库服务端,类似mysqld,每个实例启动一个进程,可以fork为Daemon运行mongo:客户端命令行工具,类似sqlplus/mysql,其实也是一个js解释器,支持js语法mongodump/mongorestore:将数据导入为bson格式的文件/将bson文件恢复为数据库,类似xtracbackupmongoexport/mongoimport:将collection导出为json/csv格式数据/将数据导入数据库,类似mysqldump/mysqlimportbsondump:将bson格式的文件转储为json格式的数据mongos:分片路由,如果使用了sharding