一、介绍

1. 传统关系型数据库的问题

传统的关系型数据库很难扩展,通常是纵向扩展,但到达一定程度时只能横向扩展。
横向扩展 也叫 水平扩展,用更多的节点支撑更大量的请求。 如成千上万的蚂蚁完成一项搬运工作
纵向扩展 又叫 垂直扩展,扩展一个点的能力支撑更大的请求。如利用1个人的能力,如蜘蛛侠逼停火车
而非关系型数据库支持分布式数据库,即可以将数据存在不同计算机中,但是对用户来说像在一台计算机中。

2.目录结构

刚安装好的mongodb只有一个bin目录。
bin目录中mongo是客户端可以连接服务端。mongod是服务端,我们通过mongod来启动服务。
通常情况下我们还要再安装目录中增加配置文件目录和日志目录。

二、数据类型

mongodb reader mongodbreader 增强版_mongodb reader

三、命令讲解

1.启停方式

bin : 存放这mongodb的命令
mongod -f 配置文件名 可以按指定配置文件启动
db.shutdownServer(); 关闭mongodb
mongo --host= 连接mongodb

2. 数据库操作命令

use 数据库名称 创建并使用该数据库
show databases 查看所有数据库
dp.dropDatabase() 删除数据库

3. 集合操作命令

集合如果没创建,也会在使用的时候隐式创建
db.createCollection(name) 显式创建集合
db.集合名.drop() 删除指定集合

4. 文档的增查命令

文档的数据格式和json基本一样,所有存储在集合中的数据都是BSON格式
(1)单个文档插入

db.集合名.insert(
	<document>,{writeConcern : <document>,ordered: <boolean>}
	)

document: 要插入到集合中的文档或者文档数据(json格式)
ordered: 可选,如果为真,则按顺序插入数组中的文档。如果其中一个文档出现错误,mongodb将返回而不处理数组中的其余文档。如果为假,如果其中一个文档出现错误,则继续处理数组中的主文档。在版本2.6+中默认为true。

(2)批量插入

db.集合名.insertMany(
	[<document1>,<document2>,<document3>],{writeConcern : <document>,ordered: <boolean>}
	)

(3)文档的基本查询

db.集合名.find(<query>,<projection>)

query:可选。使用查询运算符指定选择筛选器。若要返回集合中所有的文档,则省略此参数或传递空文档{}。 {字段1:“值1”}
projection:可选。指定要在查询筛选器匹配的文档中返回的字段。{字段1:0,字段2:1},0表示不让该字段显示,1表示显示该字段。

db.集合名.find(<query>,<projection>).pretty()

pretty() 方法以格式化的方式来显示所有文档。

(4)查询第一条数据

db.集合名.findOne(<query>,<projection>)

5. 文档的更新命令

(1)文档的更新

db.集合名.update(<query>,<update>,<options>)

(2) 覆盖修改
如果想修改_id为1的记录,likenum字段为1001,输入以下语句:

db.集合名.update({_id:1},{likenum:NumberInt(1001)})

(3)局部修改

db.集合名.update({_id:1},{$set:{likenum:NumberInt(1001)}})

(4)批量修改
上述修改只会更新符合条件的第一条记录

db.集合名.update({_id:1},{$set:{likenum:NumberInt(1001)}},{multi:true})
db.集合名.updateMany({_id:1},{$set:{likenum:NumberInt(1001)}})

(5)列值增长的修改
如果要实现对某列值在原有值的基础上增加或减少,可以使用$inc运算符来实现

db.集合名.update({_id:1},{$inc:{likenum:NumberInt(1001)}})

6. 文档的删除命令

db.集合名.remove({条件}),db.集合名.remove({_id:"1"}),删除id为1
db.集合名.remove({}) ,删除所有

7. 文档的分页查询

skip(),limit(),sort()三个放在一起执行时,执行顺序时先sort,再skip,最后显示limit(),和命令编写顺序无关。
(1)统计查询

db.集合名.count(query,options)

(2)分页查询

db.集合名.find().limit(n),返回前n条。
db.集合名.find().skip(3),跳过前两天。

(3)排序查询

db.集合名.find().sort({userid:-1,name:1}),按照userId降序,name升序排序

如果该文档没有该排序字段,则按0处理

8. 文档的复杂查询

(1)正则查询
MongoDB的模糊查询是通过正则表达式的方式实现,格式为:

db.集合名.find({字段名:/正则表达式/})

(2)比较查询

mongodb reader mongodbreader 增强版_mongodb_02


(3)包含查询

db.集合名.find({字段名:{$in:["1003","1004"]}})

$nin不包含操作符

(4)and查询

db.col.find({key1:value1, key2:value2}).pretty()

(5)or查询

db.col.find(
   {
      $or: [
         {key1: value1}, {key2:value2}
      ]
   }
).pretty()

四、索引

1.类型

(1)单字段索引
对于单个字段索引和排序操作,索引键的排序顺序并不重要,应为mongodb可以再任何方向上遍历索引。
(2)复合索引
复合索引列出的字段顺序具有意义

2.命令

(1)查看索引
db.collection.getIndexes() 返回:

[
	{
		"v" : 2,    #索引引擎版本号
		"key" : {     # 索引涉及字段
			"_id" : 1
		},
		"name" : "_id_",  #索引名称
		"ns" : "test.user"
	}
]

(2)创建索引
db.collection.createIndex(keys,options)

(3)删除索引
可以通过索引名称或索引规范文档指定索引。若要删除文本索引,请指定索引名称。
db.collection.dropIndex(index)db.collection.dropIndexes() 删除所有索引,只能删除非_id字段的索引

3.索引的使用

(1)执行计划

分析查询性能通常使用执行计划来查看查询的情况,如查询耗费的时间,是否基于索引查询等。

db.collection.find(query,options).explain(options) (2)覆盖索引

如果要查询的字段都有索引,则不会回表,直接将索引返回。

mongodb reader mongodbreader 增强版_配置文件_03

五、Springboot——MongoDB

1.添加maven依赖

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

2.编写配置文件

spring:
  data:
    mongodb:
      uri: "mongodb://localhost:27017/test"

3.工具类