MongoDB权威指南第二章 入门文档是MongoDB中数据的基本单元,类似于RDBS中的行。集合可以看作是没有模式的表。MongoDB中单个实例可以容纳多个独立的数据库。MongoDB带有JavaScript shell。每一个文档都有一个特殊键"_id",它在文档所处的集合是唯一的。2.1 文档多个键及其关联的值有序的放在一起就是文档。在JavaScript中文档表示对象。{"greeting" : "hello world"}文档的键是字符串。键可以使用任意UTF-8字符。MongoDB不区分类型,也不区分大小写。但是不能有重复的键。2.2 集合集合就是一组文档。2.2.1 无模式集合是无模式的。意味着集合里面的文档可以是各种各样的。把同种类型的文档放在一个集合里面,这样数据会更集中。当创建索引时,文档会有附加的结构。索引是按照集合来定义的,2.2.2 命名集合不能为空。集合名不能以"system."开头,这是系统集合保留的前缀。用户创建的集合名称不能包含保留字符$。子集合组织集合惯例使用"."字符分开的按命名空间划分的子集合。假如博客系统包含两个集合,分别为blog.posts和blog.authors。blog这个集合与其子集合没有任何关系。很多MongoDB工具包含了子集合。GridFS是一种存储大文件的协议,使用子集合来存储文件的元数据。MongoDB的web控制台通过子集合的方式将数据组织在DBTOP部分绝大多数驱动程序都提供了语法糖,为访问指定集合的子集合提供方便。2.3 数据库MongoDB中的多个文档组成集合,同样多个集合可以组成数据库。数据库的名字标识不能是空字符串,不能有空格,$,/,\等,全部小写,最多64字节。有些数据库名是保留的。admin:相当于具有root权限的数据库。local:这个数据永远不会复制,用来存储本地单台服务器的任意集合。config:当MongoDB用来分片设置时,config数据库在内部使用,用于保存分片的信息。把数据名放在集合名前,得到集合的完全限定名,成为命名空间。命名空间应小于100字节。2.4 启动MongoDBMongoDB启动了一个基本的HTTP服务器,监听端口比主端口高1000。可以通过浏览器访问http://localhost:28017获取数据库的管理信息。2.5 MongoDB shellMongoDB自带JavaScript shell。2.5.1 运行shellshell完全具备javascript解释器:> x = 200;200> x / 540可以利用js标准库:> Math.sin(Math.PI/2);1> new Date();ISODate("2014-02-26T12:43:42.516Z")> "hello, world".replace("world", "caoqing");hello, caoqing> 可以定义和利用js函数:> function factial(n) {... if (n <= 1) return 1;... return n * factial(n-1);... }> factial(5);1202.5.2 MongoDB客户端shell还有非js语法的扩展,方便习惯SQL shell的用户添加。2.5.3 shell中的基本操作创建,读取,更新和删除(CRUD)。1.创建insert函数添加文档到集合。> post = ({name : "caoqing", age : 25, address : "china", date : new Date() }){ "name" : "caoqing", "age" : 25, "address" : "china", "date" : ISODate("2014-02-26T12:48:09.225Z")}> db.blog.insert(post);> db.blog.find();{ "_id" : ObjectId("530de294a5a40b4574eaa3b7"), "name" : "caoqing", "age" : 25, "address" : "china", "date" : ISODate("2014-02-26T12:48:09.225Z") }2.读取find会返回集合里的所有文档,若只想查询一个,使用findOne:> db.blog.findOne();{ "_id" : ObjectId("530de294a5a40b4574eaa3b7"), "name" : "caoqing", "age" : 25, "address" : "china", "date" : ISODate("2014-02-26T12:48:09.225Z")}find和findOne可以接受查询文档形式的限定条件。3.更新update接受至少两个参数,要更新文档的限定条件,新的文档。> post.comments = [][ ]> db.blog.update({name : "caoqing"}, post);> db.blog.find();{ "_id" : ObjectId("530de294a5a40b4574eaa3b7"), "name" : "caoqing", "age" : 25, "address" : "china", "date" : ISODate("2014-02-26T12:48:09.225Z"), "comments" : [ ] }4.删除remove用来从数据库中永久地删除文档。可以接受一个限定条件,在不使用参数情况下,会删除集合里的所有文档。> db.blog.remove({name : "caoqing"});> db.blog.find();> 2.5.4 使用js shellhelp查看在线文档。db.help(),查看数据库级别的命令。db.foo.help(),查看集合级别的命令。不输入括号情况下,可以查看该函数的js源代码。> db.version;function (){ return this.serverBuildInfo().version;}集合名如果集合名是数据库类的一个属性就有问日了,只有js找不到指定属性时,才能作为集合返回。当有属性与目标集合名重名时,可以使用getCollection函数。2.6 数据类型2.6.1 基本的数据类型JSON的表现力很强,只有null,布尔,数字,字符串和数组,对象几种类型。MongoDB在此基础上添加了一些其他数据类型。对象ID,日期,正则表达式,代码,二进制数据,最大值,未定义,数组,内嵌文档2.6.2 数字MongoDB有三种数组,32位浮点数,64位浮点数和32位整数。要插入的64位整数不能准确的作为双精度数显示。2.6.3 日期Date对象用做MongoDB的日期类型。字符串和日期不能互相匹配。2.6.4 数组数组是一组值,可以作为有序对象,或无序对象操作。2.6.5 内嵌文档2.6.6 _id和ObjectIdMongoDB中存储的文档必须有一个"_id"键,每个键的值是任意类型的,一个集合中只有一个。1. ObjectIdObjectId使用十二个字节的存储空间,每个字节两位十六进制数字,是一个24位的字符串。12个字节:4位时间戳,三位机器码,2位PID,三位计数器。前4个字节隐含了文档的创建时间。3字节是所在主机的唯一标识符。接下来的两个字节是该进程标识符。后三个字节是一个计数器。2. 自动生成OjectId系统会自动帮你创建一个,但是通常在客户端由驱动程序完成。避免产生开销。驱动程序提供更加丰富的API。