一、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() { /*     ...      */ }} 
      后续在创建副本集、分片时会经常使用代码类型。