MongoDB Study Notes

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对比有如下关系:

MySQLMongoDB说明(MySQL/MongoDB)
databasedatabase数据库
tablecollection数据库表 / 集合
rowdocument数据库记录行 / 文档
columnfield数据字段 / 域
indexindex索引
table jionsMongoDB不支持表连接 / MongoDB不支持
primary keyprimary 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 tablesshow 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 更新数据

参数说明
queryupdate查询条件,类似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 >:{&lt:< value >}}db.user.find({“age”:{$lt:23}}).pretty()where age<23
小于或等于{< key >:{&lte:< value >}}db.user.find({“age”:{$lte:23}}).pretty()where age<=23
大于{< key >:{&gt:< value >}}db.user.find({“age”:{$gt:23}}).pretty()where age>23
大于或等于{< key >:{&gte:< 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的操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值