一、基本概念
文档(document)
文档是MongoDB中数据的基本单元,非常类似于关系数据库管理系统中的行,但比行要复杂的多。每一个文档都有一个特殊的键“_id”,它在文档所处的集合中是唯一的。
文档是MongoDB的核心概念,多个键及其关联的值有序地放置在一起便是文档。MongoDB以文档的形式存储数据,文档的存储格式是BSON。文档类似于编程语言类似结构存储键值对(如字典、哈希表、地图、和关联数组)。BSON是Binary JSON 的简称,是一个JSON文档对象的二进制编码格式。BSON同JSON一样支持往其它文档对象和数组中再插入文档对象和数组,同时扩展了JSON的数据类型。如:BSON有Date类型和BinDate类型。BSON有三个特点:轻量性、可遍历性、高效性。文档的存储格式如下图:
需要注意的是:
1)文档中的键/值对是有序的。
2)文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。
3)MongoDB区分数据类型和大小写。
4)MongoDB的文档不能有重复的键。
5)文档的键是字符串,除了少数例外情况,键可以使用任意UTF-8字符。
文档键命名规范:
1)键不能含有\0 (空字符)。这个字符用来表示键的结尾。
2).和$有特别的意义,只有在特定环境下才能使用。
3)以下划线“_”开头的键是保留的(不是严格要求的)。
集合(colletion)
集合就是 MongoDB 文档组,类似于关系数据库管理系统中的表格,但是是没有模式的表,这也就意味着一个集合里面的文档可以各式各样的。
集合存在于数据库中,集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。集合的使用不需要像关系数据库那样需要提前创建表格式,集合插入文档时就会被自动创建。一个集合的逻辑存储图如下所示:
集合是文档的容器,那么就需要有一个名称,有名称就有一定的规范,集合的命名规范如下:
- 集合名不能是空字符串“”。
- 集合名不能含有\0字符(空字符),这个字符表示集合名的结尾。
- 集合名不能以”system.”开头,这是为系统集合保留的前缀。
- 用户创建的集合名字不能含有保留字符,有些驱动程序的确支持在集合名里面包含,这是因为某些系统生成的集合中包含该字符。除非你要访问这种系统创建的集合,否则千万不要在名字里出现$。
虽然集合可以不需要提前创建,但也可以提前创建一个空集合,用来提前定义一些索引或约束:
MongoDB 的 db.createCollection(name,options)
方法用于在MongoDB 中创建集合。在命令中,name 是要创建的集合的名称。 options是一个文档,用于指定集合的配置。
options 参数是可选的,因此只需要指定集合的名称。 以下是可以使用的选项列表:
字段 | 类型 | 描述 |
---|---|---|
capped | Boolean | (可选)如果为 true,则启用封闭的集合。上限集合是固定大小的集合,它在达到其最大大小时自动覆盖其最旧的条目。 如果指定 true,则还需要指定 size 参数。 |
autoIndexId | Boolean | (可选)如果为 true,则在 _id 字段上自动创建索引。默认值为 false。 |
size | 数字 | (可选)指定上限集合的最大大小(以字节为单位)。 如果 capped 为 true,那么还需要指定此字段的值。 |
max | 数字 | (可选)指定上限集合中允许的最大文档数。 |
在插入文档时,MongoDB 首先检查上限集合 capped 字段的大小,然后检查 max 字段。
数据库(database)
数据库的概念跟关系型中是一样的,MongoDB中多个文档组成集合,同样多个集合可以组成一个数据库。MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,即便是在磁盘上,不同的数据库也放置在不同的文件中。不同的是MongoDB不需要提前建立数据库。
运行“use”命令,可以连接到一个指定的数据库
1 2 |
> use dbtest switched to db local |
命令“use”可以用来连接一个指定的数据库,但是如果数据库不存在,那么“use”命令则创建数据库。
执行 “show tables” 命令可以显示数据库集合
1 2 3 4 5 |
> use local switched to db local > show tables startup_log |
执行 “db” 命令可以显示当前数据库
1 2 |
> db dbtest |
执行“show dbs”命令可以显示所有数据库
1 2 |
> show dbs local 0.000GB |
可以看到,我们刚刚创建的数据库dbtest并不在数据库列表中,要显示它,我们需要向dbtest数据库中插入一些数据。
1 2 3 4 5 6 |
> db.dbtest.insert({"name":"运维那点事"}) WriteResult({ "nInserted" : 1 }) > show dbs dbtest 0.000GB local 0.000GB |
可以看到dbtest数据库以及创建好了,那么如果想要删除数据库可以使用db.dropDatabase()方法,默认db.dropDatabase()是删除当前数据库,所以我们需要先使用命令“use”切换到需要删除的数据库中。
1 2 3 4 5 6 7 8 |
> use dbtest switched to db dbtest > db.dropDatabase() { "dropped" : "dbtest", "ok" : 1 } > show dbs local 0.000GB |
数据库也通过名字来标识,数据库名可以是满足以下条件的任意UTF-8字符串。
1)不能是空字符串(“”)。
2)不得含有‘ ‘(空格)、.、$、/、\和\0 (空宇符)。
3)应全部小写。
4)最多64字节。
复制数据库
1 2 3 |
> db.copyDatabase('old_name', 'new_name'); > use old_name > db.dropDatabase(); |
PS:MongoDB中不提供修改库名,所以只有通过复制库来重命名。
特殊作用的数据库
admim
从权限的角度来看,这是“root”数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。
local
这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合
config
当MongoDB用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。
把数据库的名字放到集合名前面,得到就是集合的完全限定名,称为命名空间。例如,如果你在cms数据库中使用blog.posts集合,那么这个集合的命名空间就是cms.blog.posts。命令空间的长度不得超过121字节,在实际使用中应该小于100字节。
二、mongo shell
MongoDB自带了一个javascript shell,可以从命令行与MongoDB实例交互。这个Shell非常有用,通过它可以执行管理操作、检查运行实例等。
1. 运行Mongo Shell
1 2 3 4 |
[root@localhost ~]# mongo MongoDB shell version: 3.2.0 connecting to: test > |
Shell会在启动时自动连接MongoDB服务器,所以要确保在使用Shell之前启动mongod服务。Shell是功能完备的javascript解释器,可以运行任何javascript程序。为了证明这一点,我们运行几个简单的数学运算:
1 2 3 4 |
> x = 200 200 > x / 5 40 |
除了算术运算之外,还可以充分利用javascript的标准库,也可以定义和调用javascript函数。
2. MongoDB客户端
mongo shell虽然能运行任意javascript程序,但shell的真正威力还在于他是一个独立的mongodb客户端。开启的时候,shell会连接到mongodb服务器的test数据库,并将这个数据库连接赋值给全局变量db。这个变量时通过shell访问mongodb的主要入口点。
Shell还有些非javascript语法的扩展,是为了方便习惯于SQL的用户而添加的。这些扩展并不是提供额外的功能,但它们是很棒的语法,例如“use”命令选择数据库:
1 2 3 4 5 |
> use dbtest switched to db dbtest > db dbtest |
3)Shell帮助
由于mongo是个javascript shell,通过在线查看javascript的文档能获得很多帮助。Shell本身内置了帮助文档,可以通过help命令查看。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
> help db.help() #数据库方法使用帮助 db.mycoll.help() #集合方法使用帮助 sh.help() #分片方法使用帮助 rs.help() #复制集方法使用帮助 help admin #管理命令帮助 help connect #连接命令帮助 help keys #快捷键帮助 help misc help mr #MapReduce相关帮助 show dbs #查看数据库 show collections #查看当前数据库集合 show users #查看当前数据库用户 show profile show logs #显示访问日志名称 show log [name] #打印日志的最后一部分 use <db_name> #设置当前默认数据库 db.foo.find() #列出集合对象 db.foo.find( { a : 1 } ) #列出集合对象并可以指定where条件 it #用于迭代集合显示结果,默认一次显示20行,需要执行it继续显示下一个20行 DBQuery.shellBatchSize = x #设置默认文档显示条目(默认20条) exit #退出mongo Shell |
使用db.help()可以查看数据库级别的命令的帮助,集合的相关帮助可以通过db.foo.help()来查看。另外有个了解函数功用的技巧,就是在输入的时候不要输括号,这样就会显示该函数的javascript源代码。例如,如果想看看update的原理,可以这么做:
1 |
> db.foo.update |