一、MongoDB基本概念
1、数据库
1)、一个MongoDB中可以建立多个数据库(这点与关系型数据库一致),数据会存储在MongoDB配置中指定的data位置。并且基于MongoDB的shell(MongDB一大特性),会将数据库赋值给全局变量db,所以在使用mongo(windows中mongo.exe、lingux中mongo.sh)链接后:
show dbs // 展示所以的数据库
use db_name // 使用或链接某一个数据库(与关系型数据库一致)
db // 展示当前数据库的名称
命名要求(UTF-8字符串):1、不能是空字符串 2、不饿能够包含:空格、. 、 $ 、/ 、\ 、空字符 3、应全部小写 4、最多64个字符
3)、保留的数据库名:
admin:
将一个用户添加到admin数据库中,则该用户拥有数据库的所有权限,或者一些特殊的服务器端命令也只能从admin数据库汇中运行。
local:
该数据库永远都不能进行复制,且本服务器上的所有集合信息都存储在该数据库中。
config:
用于分片的时候,存储分片和段等信息。
2、文档
文档是MongoDB的核心概念。Document可以理解为key-value关系的json(其实叫Bson,比json更为强大),当然还可以用JavaScript的方式进行理解。使用Document的时候需要注意以下几点:
1)、Mongo的Document不仅区分大小写还区分类型:
{"a": 1} 与{"a": "1"} 是不同的字段 {"a": 3} 与 {"A": 3} 也是不同的字段
命名要求(UTF_8字符串): 1、键不能含有空字符串,这个字符表示键的结尾 2、. 和 $ 有特殊的意义(保留字)
3、集合
1)、动态文档
集合中没有想关系型数据库中那样去定义可以存储上面key或者什么类型的文档,所以好处就是,当项目需求发生变化的时候,比如需要增加一个字段的时候,只需要在后面的项目中(或者Java映射的对象中)增加字段即可,也不需要对历史数据进行处理(但是可能需要在项目中,做是否有该字段的处理)。
那么,是不是什么不相关的数据都存储到同一个集合中呢,那时候刚使用mongo的时候就会对这个很不理解,所以需要注意以下几点:
1、把不相关的文档都放在同一个集合中,对于开发还是维护都是非常不方便的。比如代码里需要将不需要文档进行处理,并且需要查询不相关的数据,并且可能是在该集合中有上亿的数据的情况下。
2、在一个集合中查询某一类型的文档,每次都需要过了掉不需要类型的文档,特别是在全表扫描的情况下,分开查询多个集合的速度要快的多。
3、把同一种类型的文档放在同一个集合汇中,数据会更加集中。并且存在很多稀疏字段,在es中是会对性能有所影响的,但是在MongoDB中,稀疏字段的影响并不是很清楚。
4、索引是按照集合进行定义和管理的,在创建索引时,需要使用文档的特殊结构(特别是在创建唯一索引时)。
命名要求:
集合名不能包含空字符串
集合名不能空字符(\0),用于表示集合名的结尾
system.
用户创建的集合名中不能包含$
二、MongoDB数据类型
1、null null表示空值或者不存在的字段 {"a" : null}
2、布尔型 与java的boolean一样 {"a" : true}
3、数值(不区分整数或浮点数) {"a" : 1.34}
但是对于整数类型可以用下面方式表示 {"a" : NumberInt("3")} 表示4字节的整数
{"a" : NumberLong("3")} 表示8字节的整数
4、字符串 UTF-8的字符串 {"a" : "string"}
5、日期 {"a" : new Date()}
6、数组 {"a" : ["b", "c" , "d", "e"]}
7、内嵌文档 {"a" : {"b" : "c" , "d" : "e"}}
8、对象id
对象id是一个12字节的ID,我文档的唯一表示,对象的默认主键 _id 就是一个对象id
{"a" : ObjectId()}
9、二进制数据
可以用UTF-8字符串保存到文档中,不能使用shell进行保存
10、代码 {"a" : function() { /* ... */ }}
后续在创建副本集、分片时会经常使用代码类型。