MongoDB笔记一之简介与入门【第一次编辑:排版】

时间:2023-01-09 20:53:56

煮酒品茶:大量序语和实例引用自书中,品茶对其实验后做的笔记上载至博客,任何有版权的人都可以直接下架下文章,谢谢合作。

2012/8/14 14:00 MongoDB笔记一之简介与入门【第一次编辑:排版】
elain2012写的MongoDB 实战系列,真心不错!

http://blog.51cto.com/zt/99

 MongoDB权威指南
 
第一章MongoDB是一种强大、灵活、可扩展的数据存储方式。它扩展了关系型数据库的众多有用功能,如辅助索引、范围查询和排序。MongoDB的功能非常丰富,比如内置的对MapReduce式聚合的支持,以及对地理空间索引的支持。优点:1、丰富的数据模型MongoDB是面向文档的数据库,将原来的“行”(row),的概念换成更加灵活的“文档”(document)模型。MongoDB没有模式:文档的键不会事先定义也不会固定不变。2、容易扩展采用的面向文档的数据模型使其可以自动在多台服务器之间分割数据,还可以平衡集群的数据和负载,自动重排文档,开发者可以专注于编写应用,需要更大的容量,只需在集群中添加新机器,然后让数据库来处理剩下的事。3、丰富的功能索引(多种快速查询,也提供了咱一的,复合的和地理空间索引能力。)存储JavaScript(开发人员不必使用存储过程了,可以直接在服务端存储JavaScript的函数和值)聚合(支持MapReduce和其它聚合工具)固定集合(集合的大小是有上限的,对某些类型的数据【如:日志】特别有用)文件存储(支持用一种容易使用的协议存储大型文件和文件的元数据)4、不牺牲速度5、简便的管理主从复制,副本集,分片等。
 
第二章  入门
 
基本概念----------------------------------------文档是MongoDB中数据的基本单元。(doucument)集合可以被看做是没有模式的表(collections)MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限。MongoDB自带JavaScript shell,用于管理MongoDB实例和操和数据。每一个文档都有一个特殊的键"_id",它在文档所处的集合中是咱一的。-----------------------------------------文档:多个键及其关联的值有序的放置在一起便是文档。(key:vlaue)
 {"cwtea" : "hello","key":"vlaue"}
注:文档中键的顺序并不重要。
 1、文档中的键/值对应是有序的 {"cwtea" : "hello","key":"vlaue"}和{"key":"vlaue","cwtea" : "hello"}完全不同 2、文档中的值可以是多种数据类型,整字,字符串,甚至文档。键可以使用任意UTF-8字符。 3、键不能含有\0(空字符),这个字符用来表示键的结尾。 4、.和$有特别的意义,只有在特定环境下才能使用。 5、以下划线"_"开头的键是保留的,虽然这个并不是严格要求的。 6、mongoDB区分类型和区分大小写 {"foo" : 3} 不同于{"foo" : "3"} 整数和字符串 { "foo" : "3"}不同于{"Foo" : "3"} 大小写 7、mongoDB不能有重复的键
 集合概念:集合就是一组文档 collections
无模式
概念:不同文档可存在同一个集合中。
命名:
可以满足下列条件的任意UTF-8字符串。1、集合名不能是空字符串""2、集合名不能含 有\0字符(空字符),这个字符表示集合名的结尾.3、集合名不能以"system."开发,这是为系统集合保留的前缀。4、用户创建的集合名字不能含有保留字符$。有些驱动程序的确支持在集合名里面包含$,这是因为某些系统生成的集合中包含该字符。
子集合:
组织集合的一种惯例是使用 "." 字符分开的按命名空间划分的子集合。GridFS是一种存储大文件的协议,使用子集合来存储文件的元数据,这样就与内容分开了。Web控制台通过子集合的方式将数据组织在DBTOP部分绝大多数驱动程序都提供语法糖,为访问指定集合的子集合提供方便。(db.blog代表blog集合,db.blog.posts代表blog.posts集合)
数据库:多个集合组成数据库。
一个MongoDB实例可承载多个数据库,它们之间可视为完全独立,每个数据库都有独立的权限控制,即便在磁盘上,不同的数据库存也放在不同的文件中。命名:数据库名最终会变成文件系统里的文件,所以会有以下限制。不能是空字符串("")不得含有''(空格)、,、$、/、/和\0(空字符)就全部是小写最多64字节
保留的数据库名:
admin(是"root"数据库,添加一个用户到这个数据库,则具有最高权限)local(这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合)config(当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息)
 
命名空间:把数据库的名字放到集合名前面,得到就是集合的完全限定名db.blog.posts,命名空间的长度不得超过121,实际使用最好不超过100字节。
 
MongoDB shell自带一个javascript shell,可以从命令行与MongoDB实例交互,可以执行管理操作,检查运行实例,变或做其他尝试。可以做javascript所做之事。
 > math.sin(math.pi /2) Mon Aug 13 23:28:19 ReferenceError: math is not defined (shell):1 > Math.sin(Math.PI /2) 1 > new Date("2010/1/1") ISODate("2009-12-31T16:00:00Z") > new Date("2010/1/1"); ISODate("2009-12-31T16:00:00Z") > "hello ,world!".replace("world", "mongodb") hello ,mongodb! > "hello ,world!".replace("world1", "mongodb") hello ,world! > "hello ,2".replace("2", "mongodb") hello ,mongodb > function factorial (n) { ... if (n <=1) return 1; ... return n * factorial(n-1) ... } > factorial(5); 120

shell的基本操作:
创建、读取、更新和删除。创建:
 > use blog switched to db blog > post = {"title" : "my blog post", ... "content" : "here is my blog post.", ... "date" : new Date()} { "title" : "my blog post", "content" : "here is my blog post.", "date" : ISODate("2012-08-13T16:24:51.467Z") } > db.blog.insert(post) > db.blog.find() { "_id" : ObjectId("50292a7870fc23d6b7514586"), "title" : "my blog post", "content" : "here is my blog post.", "date" : ISODate("2012-08-13T16:24:51.467Z") }
查询:find显示最多20条匹配
 > db.blog.findOne() { "_id" : ObjectId("50292a7870fc23d6b7514586"), "title" : "my blog post", "content" : "here is my blog post.", "date" : ISODate("2012-08-13T16:24:51.467Z") } > db.blog.find({},{"title": 1} ) { "_id" : ObjectId("50292a7870fc23d6b7514586"), "title" : "my blog post" } { "_id" : ObjectId("50292b1a70fc23d6b7514588"), "title" : "two" }
update更新:至少两个参数:第一个是要更新的文档的限定条件,第二个是新的文档。
 > post { "title" : "my blog post", "content" : "here is my blog post.", "date" : ISODate("2012-08-13T16:24:51.467Z") } > post.comments =[] [ ] > post { "title" : "my blog post", "content" : "here is my blog post.", "date" : ISODate("2012-08-13T16:24:51.467Z"), "comments" : [ ] } > post.test="hello" hello > post { "title" : "my blog post", "content" : "here is my blog post.", "date" : ISODate("2012-08-13T16:24:51.467Z"), "comments" : [ ], "test" : "hello" }  #替换标题为my blog post的文章,第一个为条件,第二个为更新内容。 > db.blog.update({title : "my blog post"}, post) > db.blog.find() { "_id" : ObjectId("50292b1a70fc23d6b7514588"), "title" : "two", "content" : ISODate("2012-08-13T16:28:10.372Z") } { "_id" : ObjectId("50292a7870fc23d6b7514586"), "title" : "my blog post", "content" : "here is my blog post.", "date" : ISODate("2012-08-13T16:24:51.467Z"), "comments" : [ ], "test" : "hello" } > db.blog.update({title : "two"}, {"title" : "baidu","content" : "www.cwtea.com" }) > db.blog.find() { "_id" : ObjectId("50292a7870fc23d6b7514586"), "title" : "my blog post", "content" : "here is my blog post.", "date" : ISODate("2012-08-13T16:24:51.467Z"), "comments" : [ ], "test" : "hello" } { "_id" : ObjectId("50292b1a70fc23d6b7514588"), "title" : "baidu", "content" : "www.cwtea.com" }
删除:remove用来从数据库中永久性地删除文档
 > db.blog.remove({"title" : "baidu"}) > db.blog.find() { "_id" : ObjectId("50292a7870fc23d6b7514586"), "title" : "my blog post", "content" : "here is my blog post.", "date" : ISODate("2012-08-13T16:24:51.467Z"), "comments" : [ ], "test" : "hello" }
#随时使用help可以使用集合(javascript)
基本数据类型:
类似于JSON叫BSON的东西。缺点:JSON没有日期类型,只有一种数字类型,没法区分浮点数和整数,更不能区分32位和64位数字,也没有办法表示其他常用类型,如正则表达式或函数。MongoDB增加了其他一些数据类型:null、布尔、32整数、64位整数、64位浮点数、字符串、符号、对象ID、日期、正则表达式、代码、二进制数据、最大值、最小值、未定义、数组、内嵌文档。数字日期:date()不等于new date()数组:{"things" : ["pie",3.14]}内嵌文档
 > lq = { "name" : "cwtea", ... "address" : { ... "a" : "1", ... "b" : "2", ... "c" : "3", ... } ... ,"hello" :"cwtea"} { "name" : "cwtea", "address" : { "a" : "1", "b" : "2", "c" : "3" }, "hello" : "cwtea" } > db.blog.insert(lq) > db.blog.find() { "_id" : ObjectId("50292a7870fc23d6b7514586"), "title" : "my blog post", "content" : "here is my blog post.", "date" : ISODate("2012-08-13T16:24:51.467Z"), "comments" : [ ], "test" : "hello" } { "_id" : ObjectId("5029363070fc23d6b7514589"), "name" : "cwtea", "address" : { "a" : "1", "b" : "2", "c" : "3" }, "hello" : "cwtea" }

id和Objectld
存储文档必须有一个"_id"默认是个ObjectId对象。ObjectId
 0-3[时间戳]4-6[机器]7-8[pid]9-11[计数器]

 

本文出自 “煮酒品茶” 博客,请务必保留此出处http://cwtea.blog.51cto.com/4500217/962420