——网鸟老兵系列课程之10天掌握MongoDB 陈颜铭出品 第一天:认识MongoDB ——网鸟老兵系列课程之10天掌握MongoDB 网鸟出击,必属精品! 微博:http://t.qq.com/ymindo QQ:120468681(ymind chan) Q群:47700865(刺客巅峰)
声明 声明一哈 网鸟QQ群 本PPT根据《MongoDB: The Definitive Guide》原版制作而成; 我很穷,但我大胆的承认我看的是盗版PDF; 如果您发现翻译或描述有误,请不吝赐教; 制作PPT时,我不一定会100%的引用书中提供的示例,看书的朋友不要见怪; 如果有任何疑问请通过微博或QQ反馈给我; 网鸟QQ群 刺客巅峰(47700865)——IT技术综合交流群组,这里神马都有。欢迎各种程序猿加入! NoSQL(23152359)——新建的NoSQL专用群组,来吧!来吧!欢迎各位光临! 研发团队(3178011)——想入此群请先xx,呵呵,请先加老陈QQ(120468681)!
MONGODB简介 功能丰富 可扩展性 无模式 高性能 易管理 索引 聚合 分布式文件系统 存储JavaScript 定容集合 可扩展性 数据分片 负载均衡 海量数据支撑 无模式 非关系型 面向文档的数据存储 高性能 空间预分配 内存映射 非事务性 易管理 Server自治机制 自动故障转移 动态集群 很多朋友将MongoDB亲切的译为“芒果”,老陈反对这个叫法,发音也相差较远,依着我,应该翻译为“猛狗”,酱紫才够强大够给力!
MONGODB数据架构 文档 集合 数据库 Database Collection Document
数据库、集合、文档命名规范 数据库 集合 文档 任意UTF-8字符串(比如:网鸟); 不能是空字符串; 不得包含以下字符: (空格) 、 .、$、/、\、\0; 长度不得超过64字节; 保留字:admin、local、config等; 集合 不能包含\0 、 $; 不能以system.开头; 文档 不能包含\0、 $; 不能以_开头;
版本选择 平台选择 下载安装 MONGODB的下载与安装 MongoDB的版本命名规范如:x.y.z; 详情:http://www.mongodb.org/display/DOCS/Version+Numbers 版本选择 生产环境使用32位机器的,老陈无话可说,反正64位又运行不了,你没的选; 在64位机器上坚决要使用64位版本,可以获得更大的内存映射空间,提升MongoDB的性能; 至于操作系统,MongoDB是跨平台的,在下载页面找自己对应的版本即可; 平台选择 下载地址:http://www.mongodb.org/downloads; 直接运行:解压后,在命令行执行%setupPath%\bin\mongod.exe即可; 作为Windows服务:请参考http://www.mongodb.org/display/DOCS/Windows+Service; 其他操作系统请参考:http://www.mongodb.org/display/DOCS/Quickstart; 下载安装
MONGODB SHELL 运行Shell 数据操作 打开命令行; 执行%setupPath%\bin\mongo.exe即可进入MongoDB Shell; 在MongoDB Shell中可以运行任何JavaScript脚本; 在Shell中可以键入help以获取帮助,当然,都是E文的; 数据操作 创建: db.test.insert({ “Name” : “ymind chan”, “age” : 8 }); 读取: db.test.find({ “Name” : “ymind chan” } ); 更新: db.test.update(“Name” : “ymind chan”, { “$set” : { “age” : “5” } } ); 删除: db.test.remove({ “Name” : “ymind chan” } ); 这里只是简单示例,更详细的教学还在后面!
MONGODB的数据类型 MongoDB底层使用Bson来维护数据,Bson是一种二进制下的类似于Json的数据格式。 以下是MongoDB中几个值得啰嗦一下的数据类型: MongoDB的基本数据类型 MongoDB的数组 MongoDB的文档嵌套 MongoDB的ObjectId
MONGODB的基本数据类型 null bool 数字 字符串 日期 regex code binary 数组 嵌套文档 其他 这个有神马好说的?? null true、false; bool 仅支持64位浮点数,其他类型的数字会自动转化为此格式; 数字 支持UTF-8字符集; 字符串 存储标准纪元开始的毫秒数,不含时区; 日期 符合JavaScript语法的正则表达式; regex 任何JavaScript代码; code 可存储任意字节数的字节数组,但在Shell中无法使用; binary 对象集合或列表在MongoDB可以被存储为数组; 数组 一个文档可以包含另外一个文档; 嵌套文档 详细内容请参考http://bsonspec.org/#/specification; 其他
MONGODB的数组 MongoDB中的数组既可以作为有序对象(如列表)来操作,也可以作为无序对象(如集合)来操作。MongoDB可以以原子操作的形式来修改或删除数组中的元素。 下面是一个数组示例(不用怀疑,这就是Json语法): { // 这个不是数组 "Status" : 0, // 这个是空数组 "Messages" : [], // 包含3个元素的数组 "ResponseBody" : [ "h010t00101025", "h010t00101039", "h010t00101040“ ] }
MONGODB的文档嵌套 文档式存储的特色就是允许文档对象的嵌套,这能够使我们的实体数据在MongoDB的存在形式更加自然。 老陈忠告:不要滥用嵌套文档,对于需要复杂运算才能完成的嵌套应当使用外键模式来解决,否则之后的DAL(Data Access Layer,数据访问层)开发会相当痛苦! 以下是一个嵌套文档的格式示例: // 根文档 { "Status" : 0, // 嵌套文档 "ResponseBody" : { "CityName" : "北京", "Keyword" : "钓鱼台", // 再套一个数组,数组的每个元素又是文档,NB吧! "Landmarks" : [ { “Name” : “北京钓鱼台国际旅行社” }, { "Name" : "钓鱼台“ } ] }
MONGODB的OBJECTID ObjectId是_id(貌似前面木有提过?木有关系,_id是MongoDB在每个文档中的默认唯一标识的名称)的默认类型。 ObjectId的结构如下: 如上图所述,ObjectId可以保证同一台机器上不同进程(即MongoDB实例)生成的值都是唯一的。详情请参考:http://www.mongodb.org/display/DOCS/Object+IDs 注意事项: 当插入的文档并没有指定_id的时候,MongoDB会自动创建,并使用ObjectId类型; _id可以被指定为其他的类型,比如整数; 关于自增标识,MongoDB没有内置自增标识,在目前的roadmap中也没有相关的规划,自定义自增标识的方法将会在后续内容中专门讲解;
结束语 采纳 缺点 分享 老陈接触MongoDB一年多了,已经被彻底征服; 我自己的项目(www.yuding8.com)已经完全抛弃了关系型数据库; 缺点 最大的缺点就是无法支持复杂运算,因为按照MongoDB的架构思想来说呢,是想把这些都转移到驱动或App上; 为了解决这个缺点,老陈自行研发了EntityDB与之互补(小声的说一句:EntityDB是使用C#开发的内存数据库托管框架,以较低的硬件成本换取高性能的复杂运算,但不保证绝对的稳定性)。 GEO搜索不支持传统意义上的距离运算,而是使用“经纬度”“差值”,这个让我很纠结,甚至我放弃了其内置的GEO特性; 分享 我强烈的推荐大家使用各种NoSQL方案来逐步的替代已有的关系型数据库(我不特指MongoDB); 对于新技术要多创建原型程序进行实践论证,而不是人云亦云,实际上我并不认为MongoDB就是绝对的最好; 我主要做.NET开发,当前MongoDB官方提供的C#驱动中的连接池管理机制存在一些问题,在使用的时候应当尽量避免并发!
广告 老陈诚邀有志之士以及乐于分享的朋友加盟组 团共建此站,此站定位是非营利性技术交流平台, 如果您抱着捞一把的心态加盟,请绕行。 老陈一年前就想组建MongoDB中文社区,但命不好,注册MongoDB.CN失败(你们懂的),第二天 被无耻的易名中国抢注,在此,偶强烈建议大家不要到易名中国查询未注册域名,那丫心贼黑!省略脏字 3000个。后来无奈,我注册了MongoDB.CC。 老陈诚邀有志之士以及乐于分享的朋友加盟组 团共建此站,此站定位是非营利性技术交流平台, 如果您抱着捞一把的心态加盟,请绕行。 祝您好运!