文章目录
- 1 MongoDB快速入门
- 1.1 什么是MongDB
- 1.2 部署安装——基于docker
- 1.3 基本概念
- 1.4 基本操作
- 1.4.1 查看所有数据库
- 1.4.2 切换数据库
- 1.4.3 创建数据库
- 1.4.4 删除数据库
- 1.4.5 查看数据库中表
- 1.4.6 新增数据
- 1.4.7 查询数据
- 1.4.8 更新数据
- 1.4.8.1 更新不存在字段
- 1.4.8.2 更新不存在的数据,默认不会新增数据
- 1.4.8.3 如果设置第一个参数为true,就是新增数据
- 1.4.4 删除数据
- 1.4.5 查询数据
- 1.5 索引
- 1.5.1 单字段索引
- 1.5.2 地理空间段索引
- 1.5.3 地理空间段索引——案例
- 2 Spring Data MongoDB
1 MongoDB快速入门
1.1 什么是MongDB
① MongoDB是基于分布式文件存储的数据库,由C++编写。
② MongoDB是介于关系数据库与非关系数据库间的产品,是非关系数据库中最类型与关系数据库的,其支持的数据结构十分分散,是类似于JSON的bson,由此可以存储复杂数据类型。
③ MongoDB有单表、多表查询也有索引。
1.2 部署安装——基于docker
docker run -d \
--name mongodb \
-p 27017:27017 \
--restart=always \
-v mongodb:/data/db \
-e MONGO_INITDB_ROOT_USERNAME=sl \
-e MONGO_INITDB_ROOT_PASSWORD=123321 \
mongo:4.4
#进入容器进行设置
docker exec -it mongodb /bin/bash
#进行认证
mongo -u "sl" -p "123321" --authenticationDatabase "admin"
#测试命令,查看已有数据库
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
1.3 基本概念
将MongoDB与MySQL对比有如下关系:
MySQL | MongoDB | 说明(MySQL/MongoDB) |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表 / 集合 |
row | document | 数据库记录行 / 文档 |
column | field | 数据字段 / 域 |
index | index | 索引 |
table jions | MongoDB不支持 | 表连接 / MongoDB不支持 |
primary key | primary key | 主键 / MongoDB自动将_id字段 设置为主键 |
1.4 基本操作
1.4.1 查看所有数据库
# 查看所有数据库 show dbs
1.4.2 切换数据库
# use关键字切换数据库 use testdb
1.4.3 创建数据库
# 在MongoDB中自动创建数据库,通过use关键字时会自动创建 use testdb2
说明
:执行show dbs
会发现无此数据库,其实他已经有了,我们进行插入数据测试
执行show dbs
发现此数据库
1.4.4 删除数据库
# drop()删除数据库,需要先使用use关键字切换到需要删除的数据库 db.dropDatabase()
执行
db.dropDatabase()
删除此数据库
1.4.5 查看数据库中表
# 查看表,需要先使用use关键字切换到表所在数据库数据库 show tables show collections
执行
show tables
或show collections
查看数据库中表
1.4.6 新增数据
# insert()新增数据,需要先使用use关键字切换到需要删除的数据库 db.user.insert({id:1,username:'zhangsan',age:20})
执行
db.user.insert({id:1,username:'zhangsan',age:20})
新增数据
1.4.7 查询数据
# find()查询数据,需要先使用use关键字切换到需要查询数据的数据库 db.user.find()
执行
db.user.insert({id:1,username:'zhangsan',age:20})
注意主键"_id"
:
① _id是集合(表)的主键,用于起飞文档记录,_id自动编入索引。
② _id默认类型为ObjectID,是MongoDB的BSON类型之一,允许用户覆盖为ObjectID以外的内容。
③ ObjectID长度为12,由2~4字节的链组成,每个链代表并指定文档身份的具体内容。
- 一个4字节的值,表示字Unix纪元(一个时间戳)以来的秒数。
- 一个3字节的机器标识符。
- 一个2字节的进程ID。
- 一个3字节的计数器,以随机值开始。
1.4.8 更新数据
参数 | 说明 |
---|---|
query | update查询条件,类似SQL update语句的where |
update | 类似SQL update查询set后面的 |
update | 类似SQL update查询set后面的 |
upsert | 若不存在update的记录,是否插入objNew,true为插入,默认是false不插入 |
multi | 默认是false,只更新找到的第一条记录,若设置为true,就更新全部查询出来的记录 |
writeConcern | 可选,抛出异常的级别 |
# 更新数据 db.user.update({id:1},{$set:{age:22}})
执行
db.user.update({id:1},{$set:{age:22}})
1.4.8.1 更新不存在字段
# 更新数据,若更新不存在的字段,会新增字段 db.user.update({id:2},{$set:{sex:1}})
执行
db.user.update({id:2},{$set:{sex:1}})
1.4.8.2 更新不存在的数据,默认不会新增数据
# 更新不存在的数据,默认不会新增数据 db.user.update({id:7},{$set:{sex:1}})
执行
db.user.update({id:7},{$set:{sex:1}})
1.4.8.3 如果设置第一个参数为true,就是新增数据
# 如果设置第一个参数为true,就是新增数据 db.user.update({id:7},{$set:{sex:1}},true)
执行
db.user.update({id:7},{$set:{sex:1}},true)
1.4.4 删除数据
参数 | 说明 |
---|---|
query | 删除文档的条件 |
justOne | 若为 true 或 1,则只删除一个文档,默认值 false,删除所有匹配条件的文档。 |
writeConcern | 抛出异常的级别 |
db.user.remove({age:20}) #删除了2条数据
#删除所有数据 db.user.remove({})
#说明:为了简化操作,官方推荐使用deleteOne()与deleteMany()进行删除数据操作。 db.user.deleteOne({id:1}) db.user.deleteMany({}) #删除所有数据
1.4.5 查询数据
语法格式:
db.user.find([query],[fields])
操作 | 格式 | 示例 | MySQL类似语句 |
---|---|---|---|
等于 | {< key >:< value >} | db.user.find({“username”:“zhangsan”}).pretty() | where username=‘zhangsan’ |
小于 | {< key >:{<:< value >}} | db.user.find({“age”:{$lt:23}}).pretty() | where age<23 |
小于或等于 | {< key >:{<e:< value >}} | db.user.find({“age”:{$lte:23}}).pretty() | where age<=23 |
大于 | {< key >:{>:< value >}} | db.user.find({“age”:{$gt:23}}).pretty() | where age>23 |
大于或等于 | {< key >:{>e:< value >}} | db.user.find({“age”:{$gte:23}}).pretty() | where age>=23 |
不等于 | {< key >:{&ne:< value >}} | db.user.find({“age”:{$ne:23}}).pretty() | where age!=23 |
查询用户名为zhangsan:
db.user.find({"username":"zhangsan"}).pretty()
查询用户年龄小于23:
db.user.find({"age":{$lt:23}}).pretty()
查询用户年龄小于等于23:
db.user.find({"age":{$lte:23}}).pretty()
查询用户年龄大于23:
db.user.find({"age":{$gt:23}}).pretty()
查询用户年龄大于等于23:
db.user.find({"age":{$gte:23}}).pretty()
查询用户年龄不等于23:
db.user.find({"age":{$ne:23}}).pretty()
db.user.find({age:{$lte:23}, id:{$gte:2}})
#and查询,age小于等于21并且id大于等于2
db.user.find({$or:[{id:1},{id:2}]})
#查询id=1 or id=2
分页查询:
db.user.find().limit(2).skip(1)
#跳过1条数据,查询2条数据
排序查询:db.user.find().sort({id:-1}) #按照age倒序排序,-1为倒序,1为正序
1.5 索引
MongoDB的索引,可以避免在读取数据室扫描集合中每个文件,直到扫描出符合条件的查询。
1.5.1 单字段索引
支持所有数据类型中的单个字段索引
#单字段索引,1表示升序创建索引,-1表示降序创建索引 db.集合名.createIndex({"字段名":排序方式})
创建索引:
db.user.createIndex({"username":1})`#创建user集合,其中username字段设置索引
查看索引
db.user.getIndexes()
查看索引大小
(单位:字节)db.user.totalIndexSize()
删除索引
db.user.dropIndex(“username_1”)
1.5.2 地理空间段索引
类型 | 说明 |
---|---|
Point(坐标点) | coordinates必须是单个位置 |
MultiPoint(多个点) | coordinates必须是位置数组 |
LineString(线形) | coordinates必须是两个或多个位置的数组 |
MultiLineString(多行线形) | coordinates必须是LineString坐标数组的数组 |
Polygon(多边形) | coordinates成员必须是 LinearRing 坐标数组的数组,必须是闭环,也就是第一个和最后一个坐标点要相同。 |
MultiPolygon(多个多边形) | coordinates成员必须是 Polygon 坐标数组的数组。 |
GeometryCollection(几何集合) | geometries是任何一个对象的集合。 |
#2dsphere索引
db.集合名.createIndex({"字段名":"2dsphere"})
#示例,创建user集合,其中loc字段设置索引 db.user.createIndex({"loc":"2dsphere"})
插入数据:
db.user.insert({id:3,username:'wangwu',age:21,loc:{type:"Point",coordinates:[116.343847,40.060539]}}) db.user.insert({id:4,username:'zhaoliu',age:23,loc:{type:"Point",coordinates:[121.612112,31.034633]}})
#多边形索引类型示例 #为scpoe集合中的scpoe字段设置球面索引 db.scope.createIndex({"loc":"2dsphere"})
1.5.3 地理空间段索引——案例
#为了便于理解,这里采用x、y坐标系的值来模拟快递员的作业范围 #coordinates格式必须是:[ [ [x,y],[x,y],[x,y] ] ] db.scope.insert({ id: 1, username: 'shkdy', scpoe: { type: "Polygon", coordinates: [ [ [0,0], [3,0], [3,3], [0,3], [0,0] ] ] } })
db.scope.insert({ id: 2, username: 'bjkdy', scpoe: { type: "Polygon", coordinates: [ [ [- 3, 3], [3, 3], [3, - 3], [- 3, - 3], [- 3, 3] ] ] } })
下方绿色重复就是一个快递员的作业范围:
2 Spring Data MongoDB
spring-data对MongoDB做了支持,使用spring-data-mongodb可以简化MongoDB的操作。