一、介绍
1. 传统关系型数据库的问题
传统的关系型数据库很难扩展,通常是纵向扩展,但到达一定程度时只能横向扩展。
横向扩展 也叫 水平扩展,用更多的节点支撑更大量的请求。 如成千上万的蚂蚁完成一项搬运工作
纵向扩展 又叫 垂直扩展,扩展一个点的能力支撑更大的请求。如利用1个人的能力,如蜘蛛侠逼停火车
而非关系型数据库支持分布式数据库,即可以将数据存在不同计算机中,但是对用户来说像在一台计算机中。
2.目录结构
刚安装好的mongodb只有一个bin目录。
bin目录中mongo是客户端可以连接服务端。mongod是服务端,我们通过mongod来启动服务。
通常情况下我们还要再安装目录中增加配置文件目录和日志目录。
二、数据类型
三、命令讲解
1.启停方式
bin : 存放这mongodb的命令mongod -f 配置文件名
可以按指定配置文件启动db.shutdownServer();
关闭mongodbmongo --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)比较查询
(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)覆盖索引
如果要查询的字段都有索引,则不会回表,直接将索引返回。
五、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.工具类