| 一、MongoDB简介1、NoSQL:非关系型数据库。 
 NoSQL 有时也称作 Not Only SQL 的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。NoSQL 用于超大规模数据的存储。(例如谷歌、Facebook 每天为他们的用户收集万亿比特的数据)。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。
 2、什么是 MongoDB? 
 MongoDB是NoSQL的典型代表,用于web的大容量的数据存储。MongoDB 是由 C++语言编写的,是一个基于分布式文件存储的开源数据库系统。在高负载的情况下,添加更多的节点,可以保证服务器性能。MongoDB 旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
 3、常用的术语| SQL术语 | MongDB术语/概念 | 解释/说明 | 
|---|
 | database | database | 数据库 |  | table | collection(集合) | 数据库表/集合 |  | row | document(文档) | 数据记录行/文档 |  | column | field(字段) | 数据字段/域 |  | index | index | 索引 |  | table join |  | 表连接,MongoDB不支持 |  | primary key | primary key | 主键,MongoDB自动将_id字段设为主键 | 
 4、数据库 
 一个 mongodb 中可以建立多个数据库。MongoDB 的默认数据库为"db",该数据库存储在 data 目录中。MongoDB 的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中。 "show dbs"
  
 数据库也通过名字来标识。数据库名可以是满足以下条件的任意 UTF-8 字符串。 不能是空字符串(“”)。不得含有’ '(空格)、.、$、/、\和\0 (空字符)。应全部小写。最多 64字节。
 5、文档需要注意的是:  
 (1) 文档中的键/值对是有序的。(2) 文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。
 (3) MongoDB 区分类型和大小写。
 (4) MongoDB 的文档不能有重复的键。
 (5) 文档的键是字符串。除了少数例外情况,键可以使用任意 UTF-8 字符。
 文档键命名规范:  
 (1) 键不能含有\0 (空字符)。这个字符用来表示键的结尾。(2) .和$有特别的意义,只有在特定环境下才能使用。
 (3) 以下划线"_"开头的键是保留的,例如:默认的主键_id.(不是严格要求的)
 6、集合 
 集合就是 MongoDB 文档组,类似于 RDBMS (关系数据库管理系统:Relational Database Management System)中的表格。集合存在于数据库中,集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。
 ??比如,我们可以将以下不同数据结构的文档插入到集合中
  当第一个文档插入时,集合就会被创建。 合法的集合名  
 集合名不能是空字符串""。集合名不能含有\0 字符(空字符),这个字符表示集合名的结尾。集合名不能以"system."开头,这是为系统集合保留的前缀。用户创建的集合名字不能含有保留字符。有些驱动程序的确支持在集合名里面包含,这是因为某些系统生成的集合中包含该字符。除非你要访问这种系统创建的集合,否则千万不要在名字里出现$。
 7、MongoDB 数据类型| 数据类型 | 描述 | 
|---|
 | Object ID | 对象 ID。用于创建文档的 ID。 |  | String | 字符串 。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。 |  | Integer | 整型数值。用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位。 |  | Boolean | 布尔值。用于存储布尔值(真/假)。 |  | Double | 双精度浮点值。用于存储浮点值。 |  | Min/Max keys | 将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对比。 |  | Array | 用于将数组或列表或多个值存储为一个键。 |  | Timestamp | 时间戳。 记录文档修改或添加的具体时间。 |  | Object | 用于内嵌文档。 |  | Null | 用于创建空值。 |  | Symbol | Symbol 符号。该数据类型基本上等同于字符串类型,但不同的是,它一般用于采用特殊符号类型的语言。 |  | Date | 日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息。 |  | Binary Data | 二进制数据。用于存储二进制数据。 |  | Regular expression | 正则表达式类型。用于存储正则表达式。 | 
 二、MongoDB的基本操作1、db:是MongoDB的默认数据库。 
 用户可以创建多个数据库。 2、创建数据库use DATABASE_NAME
 3、删除数据库db.dropDatabase()
 db 
 4、创建集合(表)db.createCollection(name, options)
  
 在 MongoDB 中,你不需要创建集合。当你插入一些文档时,MongoDB 会自动创建集合。 db.mycol2.insert({"name" : "张三"})
show collections
 5、删除集合(表)db.集合名.drop()
 如果成功删除选定集合,则 drop() 方法返回 true,否则返回 false 6、插入文档db.COLLECTION_NAME.insert(document)
  
 insert(): 若插入的数据主键已经存在,则会抛org.springframework.dao.DuplicateKeyException 异常,提示主键重复,不保存当前数据。  
 3.2 版本后还有以下几种语法可用于插入文档: db.collection.insertOne():向指定集合中插入一条文档数据db.collection.insertMany():向指定集合中插入多条文档数据
 
var document = db.collection.insertOne({"a": 3}) 
var res = db.collection.insertMany([{"b": 3}, {'c': 4}])
 7、查询文档(1)查询操作符 | 查询操作符 | 说明 | 
|---|
 | $lt | 小于 |  | $gt | 大于 |  | $or | 或 |  | $in | 表示某个集合中 |  | $size | 用来统计记录数 |  | $all | 表示所有 | 
 (2)常用函数: | 常用函数 | 说明 | 
|---|
 | sort({字段:1/-1}) | 1表示升序,-1表示降序 |  | distinct(字段) | 表示某个字段的覆盖范围 |  | limit() | 分页查询 | 
 ??举个例子:前提:创建集合为classes,如下所示
 db.createCollection("classes");
db.getCollection("classes").insert([ {
    _id: ObjectId("60fa23b7f0ca97d65028f909"),
    name: "乔峰",
    age: NumberInt("28"),
    sex: "男",
    hobby: [
        "足球",
        "武术",
        "乒乓球"
    ]
} ]);
db.getCollection("classes").insert([ {
    _id: ObjectId("60fa23b7f0ca97d65028f90c"),
    name: "段誉",
    age: NumberInt("25"),
    sex: "男",
    hobby: [
        "舞蹈",
        "武术",
        "篮球"
    ]
} ]);
db.getCollection("classes").insert([ {
    _id: ObjectId("60fa24a9f0ca97d65028f934"),
    name: "虚竹",
    age: NumberInt("23"),
    sex: "男",
    hobby: [
        "舞蹈",
        "化妆",
        "游泳"
    ]
} ]);
db.getCollection("classes").insert([ {
    _id: ObjectId("60fa24a9f0ca97d65028f937"),
    name: "令狐冲",
    age: NumberInt("25"),
    sex: "男",
    hobby: [
        "喝酒",
        "武术",
        "爬山"
    ]
} ]);
db.getCollection("classes").insert([ {
    _id: ObjectId("60fa24a9f0ca97d65028f93a"),
    name: "任盈盈",
    age: NumberInt("23"),
    sex: "女",
    hobby: [
        "舞蹈",
        "化妆",
        "武术"
    ]
} ]);
db.getCollection("classes").insert([ {
    _id: ObjectId("60fa24a9f0ca97d65028f93d"),
    name: "向问天",
    age: NumberInt("32"),
    sex: "男",
    hobby: [
        "武术",
        "喝酒",
        "足球"
    ]
} ]);
db.getCollection("classes").insert([ {
    _id: ObjectId("60fa24a9f0ca97d65028f940"),
    name: "灵儿",
    age: NumberInt("12"),
    sex: "女",
    hobby: [
        "舞蹈",
        "计算机",
        "游泳",
        "看书"
    ]
} ]);
db.getCollection("classes").insert([ {
    _id: ObjectId("60fa24fdf0ca97d65028f952"),
    name: "阿宝",
    age: NumberInt("8"),
    sex: "男",
    hobby: [
        "舞蹈",
        "画画",
        "游泳"
    ]
} ]);
db.getCollection("classes").insert([ {
    _id: ObjectId("60fa26b6f0ca97d65028f99e"),
    name: "小明",
    age: NumberInt("8"),
    sex: "男",
    hobby: [
        "跆拳道",
        "二胡",
        "游泳"
    ]
} ]);
db.getCollection("classes").insert([ {
    _id: ObjectId("60fa26b6f0ca97d65028f9a1"),
    name: "小明",
    age: NumberInt("8"),
    sex: "男",
    hobby: [
        "跆拳道",
        "画画"
    ]
} ]);
db.getCollection("classes").insert([ {
    _id: ObjectId("60fa26b6f0ca97d65028f9a4"),
    name: "小红",
    age: NumberInt("9"),
    sex: "女",
    hobby: [
        "乒乓球",
        "唱歌",
        "游泳",
        "画画"
    ]
} ]);
db.getCollection("classes").insert([ {
    _id: ObjectId("60fa26b6f0ca97d65028f9a7"),
    name: "田娃",
    age: NumberInt("11"),
    sex: "男",
    hobby: [
        "跑步",
        "计算机",
        "画画"
    ]
} ]);
db.getCollection("classes").insert([ {
    _id: ObjectId("60fa26b6f0ca97d65028f9aa"),
    name: "嘎子",
    age: NumberInt("12"),
    sex: "男",
    hobby: [
        "跆拳道",
        "二胡",
        "游泳"
    ]
} ]);
db.getCollection("classes").insert([ {
    _id: ObjectId("60fa2733f0ca97d65028f9c2"),
    name: "小王",
    age: NumberInt("10"),
    sex: "男",
    hobby: [
        "读书",
        "二胡"
    ]
} ]);
db.getCollection("classes").insert([ {
    _id: ObjectId("60fa2733f0ca97d65028f9c5"),
    name: "小李",
    age: NumberInt("12"),
    sex: "男",
    hobby: [
        "画画",
        "读书",
        "羽毛球",
        "爬山"
    ]
} ]);
 查找语句如下: db.getCollection('classes').find({})
db.classes.find({age:8})
db.classes.find({age:{$gt:10})
db.classes.find({age:{$in:[8,9,10,11,12]}})
db.classes.find({age:8,hobby:'画画',sex:'男'})
db.classes.find({$or:[{age:{$lt:8}},{age:{$gt:12}}]})
db.classes.find({$or:[{age:9},{age:11}]})
db.classes.find({hobby:{$size:2}})
db.classes.find({hobby:'计算机'})
db.classes.find({hobby:'画画',hobby:'跳舞'})
db.classes.find({hobby:{$all:['画画','跳舞']}})
db.classes.find().sort({age:-1})[1]
db.classes.distinct('hobby')
db.classes.find().sort({age:1}).limit(3)
 8、更新文档 
 (1)updateOne():更新一条记录 | 更新操作符 | 说明 | 
|---|
 | $set | 设置新的值 |  | $push | 追加一个内容 |  | $pushAll | 追加多个内容 |  | $addToSet | 增加内容并且设置增加的条件 |  | $each | 用于查找。和$addToSet联合使用时表示若存在则不添加,若不存在则添加 |  | $inc | 用于字段值的增加 |  | $unset | 删除某个字段 |  | $pop | 删除某个字段的第一个值 | 
  
 (2)updateMany():更新所有记录 更新语句如下: 
db.classes.updateOne({name:'小红'},{$set:{age:8,hobby:['跳舞','画画']}})
db.classes.find({name:'小红'})
db.classes.find({name:'小明'})
db.classes.updateOne({name:'小明'},{$push:{hobby:'唱歌'}})
db.classes.updateOne({name:'小王'},{$pushAll:{hobby:['吹牛','打篮球']}}})
db.classes.find({name:'小王'})
db.classes.find({name:'小李'})
db.classes.updateOne({name:'小李'},{$addToSet:{$each:['跑步','唱歌']}}})
db.classes.updateMany({},{$inc:{age:1}})
db.classes.find({})
db.classes.updateOne({name:'小明'},{$unset:{sex:""}})
db.classes.find({name:'小明'})
db.classes.updateOne({name:'小李'},{$pop:{hobby:-1}})    
db.classes.find({name:'小王'})
db.classes.updateOne({name:'小王'},{$set:{备注:{民族:'回族',习俗:'不吃猪肉'}}})
db.classes.updateOne({name:'小王'},{$Set:{宗教:'伊斯兰教'}}})
 9、删除文档 
 (1)deleteMany():删除所有记录  
 (2)deleteOne():删除某个记录 |