一.MongoDB相关概念
1.1.简介
MongoDB是一个开源,高性能,无模式的文档性数据库,当初的设计就是用于简化开发和方便扩展,是NoSQL数据库产品中的一种。是最像关系型数据库(MySQL)的非关系数据库。
它支持的数据结构非常松散,是一种类似于json的格式叫BSON,所以它既可以储存比较复杂的数据类型,又相当灵活
MongoDB中的记录是一个文档,它是一个由字段和值对(field:value)组成的数据结构。MongoDB文档类似于jSON对象,即一个文档认为就是一个对象。字段的数据类型是字符型,他的值除了使用基本的一些类型外,还可以包括其他文档,普通数组和文档数组。
1.2.体系结构
MYSQL和MongDB对比
SQL术语/概念 | MongDB术语/概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接,MongDBb不支持 | |
嵌入文档 | MongoDB通过嵌入式文档来代替多表连接 | |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
1.3数据模型
二.基本常用命令
2.1.启动MongoDB数据库
1.在bin目录中打开命令提示符,输入如下命令:
mongod --dbpath=..\data\db
2.配置文件启动服务
客户端连接MongoDB
1.到MongoDB官网下载MongoDB Compass并连接
2.在navicat中连接MongoDB
2.2默认保留的数据库
·admin: 从权限角度考虑,这是root数据库,如果将一个用户添加到这个数据库,这个用户自动继承所以数据库的权限,一些特定的服务端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器
·local:数据永远不会被复制,可以用来储存于本地的单台服务器的集合(部署集群,分片等)
·config:Mongo用于分片设置时,config数据库在内部使用,用来保存分片的相关信息
show dbs
use articledb
db
当使用use articledb 的时候,articledb其实存放在内存中,只有数据库存一个集合collection之后,mongodb才会将这个数据库持久化到硬盘中。
2.3基本的CRUD
2.3.1创建文档
使用insert()或者save()方法向集合中插入文档,语法如下:
db.collection.insert({
"a":" ",
"b":1
})
使用insertMany()方法进行批量插入
db.collection.insertMany([
{<document 1>},
{<document 2>}
])
2.3.2删除文档
删除文档的语法结构:
db.集合名称.remove(条件)
以下语句可以将数据全部删除
db.comment.remove({})
例如:
db.comment.remove({_id:"1"})
2.3.3修改文档
(1)覆盖的修改
如果我们想修改_id为1的记录,点赞量为1001,输入以下语句:
数据库注释.update({_id:“1”},{ikenum:NumberInt(1001)})
执行后,我们会发现,这条文档除了likenum字段其它字段都不见了
(2)同部修改
为了解决这个问题,我们需要使用修改器$set来实现,命令如下:
我们想修改id为2的记录,浏览量为889,输入以下语句:
DB.COMMENT.UPDATE( _id:“2”},{$set:{likenum:NumberInt(889)}})
这样就OK啦。
(3)批量的修改
更新所有用户为1003的用户的昵称为凯撒大帝。
//默认只修改第一条数据
db.comment.update({userid:“1003”},{$set:{NickName:“凯撒2”}})
//修改所有符合条件的数据
db.comment.update({userid:“1003”},{$set:{NickName:“凯撒大帝”}},{mult:true})
提示:如果不加后面的参数,则只更新符合条件的第一条记录
2.3.4查找文档
查询所有
db.comment.find()或db.comment.find({})
每条文档会有一个_id的字段,相当于关系数据库中表的主键,当你插入文档记录时没有指定
该字段,MongoDB会自动创建,类型为ObjectID类型
查询单个
db.comment.find({ userid:' 1 '})
db.comment.findOne({ userid:' 1 ' }) (只查找符合条件的第一条)
排序查询
db.collection.find().sort({KEY:1})
或db.集合名称.find().sort(排序方式)
例:db.comment.find().sort({userid:-1 , likenum:1}) (1为升序排列,2为降序排列)
skip(),limilt(),sort()三个放在一起执行的时候,执行的顺序是先sort(),然后skip(),最后是显示的limit(),和命令编写顺序无关。
分页查询
db.collection.count(query,options)
db.collection.find().limit(number).skip(number)---------limit返回几条数据,skip跳过几条数据
Parameter | Type | Description |
---|---|---|
query | document | 查询选择条件 |
options | document | 可选。用于修改计数的额外选项 |
投影查询
db.comment.find({userid:"1002"},{userid:1,nickname:1})
查询结果只显示_id,userid,nickname,如若不想现实_id, 将_id:0加入
正则的复杂条件查询
db.collection.find({ field:/正则表达式/})
或
db.集合.find({字段:/正则表达式/})
db.comment.find({content:/开水/}) 查询评论内容包含“开水”的所有文档
db.comment.find({content:/^专家/}) 查询评论内容的以”开水“开头的文档
比较查询
db.集合名称.find({ "field":{ $gt: value }}) // 大于:field > value
db.集合名称.find({ "field":{ $lt: value }}) // 小于:field < value
db.集合名称.find({ "field":{ $gte: value }}) // 大于等于:field >= value
db.集合名称.find({ "field":{ $lte: value }}) // 小于等于:field <= value
db.集合名称.find({ "field":{ $ne: value }}) // 不等于:field != value
如:db.comment.find({ likenum:{ $gt :NumberInt(700)}})
包含查询
示例:查询评论的集合中userid字段包含1003或1004的文档
db.comment.find({userid: { $in : ["1003","1004"]}})
如若查询评论集合中userid字段不包含1003和1004的文档,只需将 in 换成 nin
条件连接查询
$and : [{ } , { } , { }]
示例:查询评论集合中likenum大于等于700且小于2000的文档:
db.commnet.find( { $and : [ { likenum:{ $gte : NumberInt(700) } } , {likenum:{$lt : NumberInt(2000) } } ] } )
如果两个条件以上是或者关系,使用方式与and一样,把 and 换为 or
三.索引
3.1概述
索引支持在 MongoDB 中高效地执行查询.如果没有索引, MongoDB 必须执行全集合扫描, 即扫描集合中的每个文档, 以选择与查询语句 匹配的文档.这种扫描全集合的查询效率是非常低的, 特别在处理大量的数据时, 查询可以要花费几十秒甚至几分钟, 这对网站的性能是非常致命的.
如果查询存在适当的索引, MongoDB 可以使用该索引限制必须检查的文档数.
索引是特殊的数据结构, 它以易于遍历的形式存储集合数据集的一小部分.索引存储特定字段或一组字段的值, 按字段值排序.索引项的排 序支持有效的相等匹配和基于范围的查询操作.此外, MongoDB 还可以使用索引中的排序返回排序结果.
MongoDB 使用的是 B Tree, MySQL 使用的是 B+ Tree
3.2索引的类型
单字段索引
MongoDB 支持在文档的单个字段上创建用户定义的升序/降序索引, 称为单字段索引 Single Field Index
对于单个字段索引和排序操作, 索引键的排序顺序(即升序或降序)并不重要, 因为 MongoDB 可以在任何方向上遍历索引.
复合索引
MongoDB 还支持多个字段的用户定义索引, 即复合索引 Compound Index
复合索引中列出的字段顺序具有重要意义.例如, 如果复合索引由 { userid: 1, score: -1 } 组成, 则索引首先按 userid 正序排序, 然后 在每个 userid 的值内, 再在按 score 倒序排序.
其他索引
地理空间索引 Geospatial Index
文本索引 Text Indexes
哈希索引 Hashed Indexes
3.3索引管理操作
索引的查看
db.collection.getIndexes()
默认 _id 索引: MongoDB 在创建集合的过程中, 在 _id 字段上创建一个唯一的索引, 默认名字为 _id , 该索引可防止客户端插入两个具有相同值的文 档, 不能在 _id 字段上删除此索引.
注意:该索引是唯一索引, 因此值不能重复, 即 _id 值不能重复的.
在分片集群中, 通常使用 _id 作为片键.
索引的创建
db.collection.createIndex(keys, options)
options(更多选项)列表
注意在 3.0.0 版本前创建索引方法为 db.collection.ensureIndex() , 之后的版本使用了 db.collection.createIndex() 方法, ensureIndex() 还能用, 但只是 createIndex() 的别名.
举个🌰
$ db.comment.createIndex({userid:1})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}$ db.comment.createIndex({userid:1,nickname:-1})
...
索引的删除
# 删除某一个索引
$ db.collection.dropIndex(index)# 删除全部索引
$ db.collection.dropIndexes()
_id 的字段的索引是无法删除的, 只能删除非 _id 字段的索引
示例
# 删除 comment 集合中 userid 字段上的升序索引
$ db.comment.dropIndex({userid:1})
3.4 索引的使用
执行计划
分析查询性能 (Analyze Query Performance) 通常使用执行计划 (解释计划 - Explain Plan) 来查看查询的情况
$ db.<collection_name>.find( query, options ).explain(options)
比如: 查看根据 user_id 查询数据的情况
未添加索引之前
"stage" : "COLLSCAN", 表示全集合扫描
添加索引之后
"stage" : "IXSCAN", 基于索引的扫描
四.SpringBoot整合MongoDB
1.导入依赖坐标
2.在yml配置MongoDB
3.实体类
@Data//lombok @Document("comment")//可以省略,如果省略,默认使用类名小写映射集合 public class Comment { //@Id 该属性的值会自动对应mongodb的主键字段"_id",如果属性名为id可省略private Integer id; //@Field("content")//该属性对应mongodb字段的名字,如果一致,则无需该注解private String name;private String age; }