mongodb:一篇搞定mongodb::跟着宝哥学java

一:nosql

1.1 历史

image-20210705092027466

1.2 nosql

image-20210705092151710

1.3 nosql使用场景

image-20210705092600318

1.4 nosql和sql的比较

image-20210705093125598

1.5 nosql的四大家族

  • key-value键值型

    image-20210705093221317

  • document-oriented文档类型

image-20210705093447544

  • column-fimally 列式存储

image-20210705093643191

  • graph-oriented图形存储

image-20210705094027576

1.6 nosql的优缺点

  • 优点
1 高扩展性
2 无标准化
3 分布式计算
4 不支持复杂运算
5 底成本
  • 缺点
无复杂关系
无统一sql
无事务
数据安全性差
  • 使用场景
* 数据模型简单
* 表结构多变
* 查询性能要求高
* 不需要数据的高度一致性
* 给定一个关键字(key) 可以容易的获取相对复杂的值

二: mongodb

2.1 简介

image-20210705095826362


MongoDB是一个基于分布式文件存储 的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

image-20210705100233703

2.2 mongodb与rdbms的对比

image-20210705100505433

image-20210705100524033

2.3 数据类型

image-20210705100717457

2.4 mongodb的使用场景

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BCHHzkBd-1683191914745)(imgs/image-20220802092712193.png)]

三:安装mongodb

  • 上传+解压+重命名
[root@java34master soft]# tar -zxvf mongodb-linux-x86_64-rhel70-4.4.6.tgz 
[root@java34master soft]# mv mongodb-linux-x86_64-rhel70-4.4.6 mongodb
[root@java34master soft]# ll
...
drwxr-xr-x   3 root root       100 75 10:14 mongodb
-rw-r--r--   1 root root  72077387 75 10:13 mongodb-linux-x86_64-rhel70-4.4.6.tgz
  • 目录介绍 bin

image-20210705101733327

  • 创建必须要的文件/文件夹
[root@java34master bin]# mkdir -p /usr/soft/mongodb/data/db   #创建存储数据的文件夹
[root@java34master bin]# mkdir -p /usr/soft/mongodb/log       #创建存储信息的文件夹     
[root@java34master bin]# touch /usr/soft/mongodb/log/mongo.log  #创建存储信息的文件
  • 启动服务器端mongod
[root@java34master bin]# cd ..   #进入mongodb的根目录下
[root@java34master mongodb]# bin/mongod --dbpath /usr/soft/mongodb/data/db --logpath /usr/soft/mongodb/log/mongo.log --logappend --port 27017 --bind_ip 0.0.0.0
#参数说明
#--dbpath /usr/soft/mongodb/data/db 指定数据存储位置
#--logpath /usr/soft/mongodb/log/mongo.log  指定日志存储文件
#--logappend  指定日志存储方式 :累加
# --port 27017 --bind_ip 0.0.0.0 指定开启服务的端口和ip
  • 运行客户端mongo
[root@java34master ~]# cd /usr/soft/mongodb   #进入mongo的根目录
[root@java34master mongodb]# bin/mongo   #启动客户端
MongoDB shell version v4.4.6
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("175a9805-ab51-4b5f-9856-545e8836d098") }
MongoDB server version: 4.4.6
...
---
> show databases;   #显示所有的数据库
admin   0.000GB
config  0.000GB
local   0.000GB
  • 服务器后台启动:–fork
[root@java34master mongodb]# bin/mongod --dbpath /usr/soft/mongodb/data/db/  --logpath /usr/soft/mongodb/log/mongo.log --logappend --port 27017 --bind_ip 0.0.0.0 --fork
about to fork child process, waiting until server is ready for connections.
forked process: 1660
child process started successfully, parent exiting
  • 关闭服务器端
# 前台关闭:ctrl+c
# 通过杀死进程:实现杀死任何进程
[root@java34master mongodb]# ps -ef | grep mongod
root       1749   1578  7 11:24 pts/2    00:00:02 bin/mongod --dbpath /usr/soft/mongodb/data/db/ --logpath /usr/soft/mongodb/log/mongo.log --logappend --port 27017 --bind_ip 0.0.0.0
root       1788   1548  0 11:24 pts/1    00:00:00 grep --color=auto mongod
[root@java34master mongodb]# kill -9 1578
#后台开启:
[root@java34master mongodb]# bin/mongod --dbpath /usr/soft/mongodb/data/db --logpath /usr/soft/mongodb/log/mongo.log --logappend --port 27017 --bind_ip 0.0.0.0 --fork
about to fork child process, waiting until server is ready for connections.
forked process: 1816
child process started successfully, parent exiting
#后台关闭:添加参数:--shutdown
[root@java34master mongodb]# bin/mongod --dbpath /usr/soft/mongodb/data/db --logpath /usr/soft/mongodb/log/mongo.log --logappend --port 27017 --bind_ip 0.0.0.0 --shutdown
killing process with pid: 1816
[root@java34master mongodb]# ps -ef | grep mongod
  • 简化启动命令:方案1:通过shell脚本
#创建后台启动脚本  /usr/soft/mongodb/start.sh
[root@java34master mongodb]# touch start.sh  #创建文件
[root@java34master mongodb]# vim start.sh  #编辑文件
[root@java34master mongodb]# cat start.sh #查看内容
bin/mongod --dbpath /usr/soft/mongodb/data/db --logpath /usr/soft/mongodb/log/mongo.log --logappend --port 27017 --bind_ip 0.0.0.0 --fork
[root@java34master mongodb]# ./start.sh  
-bash: ./start.sh: 权限不够
[root@java34master mongodb]# chmod  777 start.sh  #  设置权限
[root@java34master mongodb]# ./start.sh   #运行脚本
about to fork child process, waiting until server is ready for connections.
forked process: 1922
child process started successfully, parent exiting


#创建后台关闭脚本   /usr/soft/mongodb/stop.sh
[root@java34master mongodb]# touch stop.sh
[root@java34master mongodb]# vim stop.sh
[root@java34master mongodb]# cat stop.sh #查看内容
bin/mongod --dbpath /usr/soft/mongodb/data/db --logpath /usr/soft/mongodb/log/mongo.log --logappend --port 27017 --bind_ip 0.0.0.0 --shutdown
[root@java34master mongodb]# ./stop.sh
-bash: ./stop.sh: 权限不够
[root@java34master mongodb]# chmod 777 stop.sh  #设置权限
[root@java34master mongodb]# ./stop.sh
killing process with pid: 1922
  • 简化启动命令:方案2:通过配置文件
[root@java34master mongodb]# mkdir conf   #创建文件夹
[root@java34master mongodb]# touch conf/mongo.conf  #创建文件
[root@java34master mongodb]# vim conf/mongo.conf  #编辑
[root@java34master mongodb]# cat conf/mongo.conf  #查看内容:注意 参数与站之间用=
# 数据位置
dbpath = /usr/soft/mongodb/data/db 
# 日志文件
logpath = /usr/soft/mongodb/log/mongo.log 
# 日志累加
logappend = true 
# 端口
port = 27017 
# ip
bind_ip = 0.0.0.0 
#后台启动
fork = true
[root@java34master mongodb]# bin/mongod -f conf/mongo.conf   #启动
about to fork child process, waiting until server is ready for connections.
forked process: 1986
child process started successfully, parent exiting
[root@java34master mongodb]# bin/mongod -f conf/mongo.conf --shutdown   #关闭
killing process with pid: 1986

四:mongodb常用的命令

4.1 用户管理

image-20210705114943289

  • 进入admin数据库 创建用户:db.createUser()
> use admin
switched to db admin
> db.createUser({user:"mtb",pwd:"123",roles:[{role:"readWriteAnyDatabase",db:"admin"}]});
Successfully added user: {
	"user" : "mtb",
	"roles" : [
		{
			"role" : "readWriteAnyDatabase",
			"db" : "admin"
		}
	]
}
  • 显示所有用户
> show users;
{
	"_id" : "admin.mtb",
	"userId" : UUID("022cd073-a884-4a6f-800a-dbed2d3a40a8"),
	"user" : "mtb",
	"db" : "admin",
	"roles" : [
		{
			"role" : "readWriteAnyDatabase",
			"db" : "admin"
		}
	],
	"mechanisms" : [
		"SCRAM-SHA-1",
		"SCRAM-SHA-256"
	]
}
  • 开启mongodb的登录验证:添加启动参数:–auth
#配置文件启动 添加验证:::添加参数--auth   
[root@java34master mongodb]# bin/mongod -f conf/mongo.conf --auth  
[root@java34master mongodb]# cat conf/mongo.conf
# 数据位置
dbpath = /usr/soft/mongodb/data/db 
# 日志文件
logpath = /usr/soft/mongodb/log/mongo.log 
# 日志累加
logappend = true 
# 端口
port = 27017 
# ip
bind_ip = 0.0.0.0 
#后台启动
fork = true
#开启登录验证
auth = true


#shell脚本启动 添加验证:::添加auth=true
[root@java34master mongodb]# cat start.sh
bin/mongod --dbpath /usr/soft/mongodb/data/db --logpath /usr/soft/mongodb/log/mongo.log --logappend --port 27017 --bind_ip 0.0.0.0 --auth --fork 
  • 登录客户端 通过验证::db.auth(name,pwd);
> show databases;  #显示数据库:没有验证不显示任何结果
> use db01;
switched to db db01
> db.test1.insert({name:"韩梅梅"});  #没有验证不能执行此操作
WriteCommandError({
	"ok" : 0,
	"errmsg" : "command insert requires authentication",
	"code" : 13,
	"codeName" : "Unauthorized"
})
> db.auth("mtb","123");  #mtb用户是在admin数据库下创建  必须切换到admin下才能登录mtb
Error: Authentication failed.
0
> use admin;   #切换到admin数据库下
switched to db admin
> db.auth("mtb","123");  #验证
1 
> db.test1.insert({name:"韩梅梅"});   #执行成功  :在当前数据库admin下创建一个集合test1 插入一条数据
WriteResult({ "nInserted" : 1 })
> db.test1.find();  #查询  mongodb默认使用_id作为主键
{ "_id" : ObjectId("60e285181d62795e17523845"), "name" : "韩梅梅" }
  • 先取消登录验证:创建多个用户
db.createUser({user:"miao",pwd:"123",roles:[{role:"userAdminAnyDatabase",db:"admin"},{role:"readWriteAnyDatabase",db:"admin"},{role:"dbAdminAnyDatabase",db:"admin"}]});
db.createUser({user:"mtb",pwd:"123",roles:[{role:"userAdminAnyDatabase",db:"admin"},{role:"readWriteAnyDatabase",db:"admin"},{role:"dbAdminAnyDatabase",db:"admin"}]});
db.createUser({user:"tian",pwd:"123",roles:[{role:"userAdminAnyDatabase",db:"admin"},{role:"readWriteAnyDatabase",db:"admin"},{role:"dbAdminAnyDatabase",db:"admin"}]});
db.createUser({user:"bao",pwd:"123",roles:[{role:"userAdminAnyDatabase",db:"admin"},{role:"readWriteAnyDatabase",db:"admin"},{role:"dbAdminAnyDatabase",db:"admin"}]});
> show users;
{
	"_id" : "admin.bao",
	"userId" : UUID("7465ad02-b18c-4899-b2a2-8fb35a3f155b"),
	"user" : "bao",
	"db" : "admin",
	"roles" : [
		{
			"role" : "readWriteAnyDatabase",
			"db" : "admin"
		}
	],
	"mechanisms" : [
		"SCRAM-SHA-1",
		"SCRAM-SHA-256"
	]
}
{
	"_id" : "admin.miao",
	"userId" : UUID("7aa75a60-f6eb-419c-bf97-6c5d88efceb0"),
	"user" : "miao",
	"db" : "admin",
	"roles" : [
		{
			"role" : "userAdminAnyDatabase",
			"db" : "admin"
		},
		{
			"role" : "readWriteAnyDatabase",
			"db" : "admin"
		},
		{
			"role" : "dbAdminAnyDatabase",
			"db" : "admin"
		}
	],
	"mechanisms" : [
		"SCRAM-SHA-1",
		"SCRAM-SHA-256"
	]
}
{
	"_id" : "admin.mtb",
	"userId" : UUID("022cd073-a884-4a6f-800a-dbed2d3a40a8"),
	"user" : "mtb",
	"db" : "admin",
	"roles" : [
		{
			"role" : "readWriteAnyDatabase",
			"db" : "admin"
		}
	],
	"mechanisms" : [
		"SCRAM-SHA-1",
		"SCRAM-SHA-256"
	]
}
{
	"_id" : "admin.tian",
	"userId" : UUID("64267a1f-6f5b-403b-b254-f5088ac71fda"),
	"user" : "tian",
	"db" : "admin",
	"roles" : [
		{
			"role" : "userAdminAnyDatabase",
			"db" : "admin"
		}
	],
	"mechanisms" : [
		"SCRAM-SHA-1",
		"SCRAM-SHA-256"
	]
}
  • 更改密码1:db.changeUserPassword(用户名字,新的密码)
  • 更改密码2:db.updateUser(用户名字,{pwd:新的密码})
> db.updateUser("tian",{pwd:"111"});

> db.changeUserPassword("tian","123");
> db.auth("tian","123");
1
> db.auth("miao","123");
1
  • 修改权限:db.updateUser(用户名字,{roles:[{role:权限1},{role:权限2}]})
> db.updateUser("tian",{roles:[{role:"userAdminAnyDatabase",db:"admin"},{role:"readWriteAnyDatabase",db:"admin"},{role:"dbAdminAnyDatabase",db:"admin"}]});
> show users;
{
	"_id" : "admin.bao",
	"userId" : UUID("7465ad02-b18c-4899-b2a2-8fb35a3f155b"),
	"user" : "bao",
	"db" : "admin",
	"roles" : [
		{
			"role" : "readWriteAnyDatabase",
			"db" : "admin"
		}
	],
	"mechanisms" : [
		"SCRAM-SHA-1",
		"SCRAM-SHA-256"
	]
}
{
	"_id" : "admin.miao",
	"userId" : UUID("7aa75a60-f6eb-419c-bf97-6c5d88efceb0"),
	"user" : "miao",
	"db" : "admin",
	"roles" : [
		{
			"role" : "userAdminAnyDatabase",
			"db" : "admin"
		},
		{
			"role" : "readWriteAnyDatabase",
			"db" : "admin"
		},
		{
			"role" : "dbAdminAnyDatabase",
			"db" : "admin"
		}
	],
	"mechanisms" : [
		"SCRAM-SHA-1",
		"SCRAM-SHA-256"
	]
}
{
	"_id" : "admin.mtb",
	"userId" : UUID("022cd073-a884-4a6f-800a-dbed2d3a40a8"),
	"user" : "mtb",
	"db" : "admin",
	"roles" : [
		{
			"role" : "readWriteAnyDatabase",
			"db" : "admin"
		}
	],
	"mechanisms" : [
		"SCRAM-SHA-1",
		"SCRAM-SHA-256"
	]
}
{
	"_id" : "admin.tian",
	"userId" : UUID("64267a1f-6f5b-403b-b254-f5088ac71fda"),
	"user" : "tian",
	"db" : "admin",
	"roles" : [
		{
			"role" : "userAdminAnyDatabase",
			"db" : "admin"
		},
		{
			"role" : "readWriteAnyDatabase",
			"db" : "admin"
		},
		{
			"role" : "dbAdminAnyDatabase",
			"db" : "admin"
		}
	],
	"mechanisms" : [
		"SCRAM-SHA-1",
		"SCRAM-SHA-256"
	]
}
  • 删除用户:db.dropUser(用户名);
> db.auth("miao","123");
1
> db.dropUser("tian");
true
> show users;
{
	"_id" : "admin.bao",
	"userId" : UUID("7465ad02-b18c-4899-b2a2-8fb35a3f155b"),
	"user" : "bao",
	"db" : "admin",
	"roles" : [
		{
			"role" : "readWriteAnyDatabase",
			"db" : "admin"
		}
	],
	"mechanisms" : [
		"SCRAM-SHA-1",
		"SCRAM-SHA-256"
	]
}
{
	"_id" : "admin.miao",
	"userId" : UUID("7aa75a60-f6eb-419c-bf97-6c5d88efceb0"),
	"user" : "miao",
	"db" : "admin",
	"roles" : [
		{
			"role" : "userAdminAnyDatabase",
			"db" : "admin"
		},
		{
			"role" : "readWriteAnyDatabase",
			"db" : "admin"
		},
		{
			"role" : "dbAdminAnyDatabase",
			"db" : "admin"
		}
	],
	"mechanisms" : [
		"SCRAM-SHA-1",
		"SCRAM-SHA-256"
	]
}
{
	"_id" : "admin.mtb",
	"userId" : UUID("022cd073-a884-4a6f-800a-dbed2d3a40a8"),
	"user" : "mtb",
	"db" : "admin",
	"roles" : [
		{
			"role" : "readWriteAnyDatabase",
			"db" : "admin"
		}
	],
	"mechanisms" : [
		"SCRAM-SHA-1",
		"SCRAM-SHA-256"
	]
}

4.2 数据库操作

> show databases;   #显示所有数据库
admin   0.000GB
config  0.000GB
local   0.000GB
> show dbs;         #显示所有数据库
admin   0.000GB
config  0.000GB
local   0.000GB
> use db_1;       #使用数据库:如果数据库不存在 就创建
switched to db db_1
> show dbs;      # mongodb中大量使用懒惰机制:只有当数据库中插入了数据  数据库才创建
admin   0.000GB
config  0.000GB
local   0.000GB
> db.test01.insert({name:"hhhh"});  #往数据库db_1的集合test01中插入一条文档
WriteResult({ "nInserted" : 1 })
> show dbs;   # 数据库db_1被创建了
admin   0.000GB
config  0.000GB
db_1    0.000GB
local   0.000GB
> use db_1;         #进入数据库
switched to db db_1
> db.dropDatabase();  #删除数据库  删除的是当前数据库   必须进入某个数据库
{ "dropped" : "db_1", "ok" : 1 }
> show dbs;
admin   0.000GB
config  0.000GB
local   0.000GB

4.3 集合操作

image-20210705150223407

  • 创建集合:

    db.createCollection(集合名字,集合参数) :显式创建

    db.集合名字.insert(文档) :隐式创建

  • 显示所有集合

show tables;

show collections;

  • 删除集合:

db.集合名.drop()

> db.createCollection("test02", { capped : true, autoIndexId : true, size :6142800, max : 10000 });  #autoIndexId是过时参数
{
	"note" : "The autoIndexId option is deprecated and will be removed in a future release",
	"ok" : 1
}
> db.createCollection("test02", { capped : true, size :6142800, max : 10000 });
{
	"ok" : 0,
	"errmsg" : "Collection already exists. NS: db_1.test02",
	"code" : 48,
	"codeName" : "NamespaceExists"
}
> db.createCollection("test03", { capped : true, size :6142800, max : 10000 });
{ "ok" : 1 }
> show collections;   
test01
test02
test03
> db.createCollection("test04");
{ "ok" : 1 }
> db.test05.insert({name:"aaa"});
WriteResult({ "nInserted" : 1 })
> show collections;
test01
test02
test03
test04
test05
> show tables;
test01
test02
test03
test04
test05
> db.test01.drop();
true
> db.test02.drop();
true
> show tables;
test03
test04
test05

4.4 文档操作

  • 添加数据

db.集合名字.insert(文档)

db.集合名字.insertOne(文档)

db.集合名字.insertMany([文档1,文档2,文档3])

> db.test01.insert({name:"name1"});
WriteResult({ "nInserted" : 1 })
> db.test01.insertOne({name:"name2"});
{
	"acknowledged" : true,
	"insertedId" : ObjectId("60e2b19b08f3eafcd0f5a132")
}
> db.test01.find();
{ "_id" : ObjectId("60e2b19108f3eafcd0f5a131"), "name" : "name1" }
{ "_id" : ObjectId("60e2b19b08f3eafcd0f5a132"), "name" : "name2" }
> db.test01.insertMany([{age:11,name:"ehh1"},{isdy:true,name:"hehe2"},{sex:"女",name:"呵呵呵3"}]);
{
	"acknowledged" : true,
	"insertedIds" : [
		ObjectId("60e2b21608f3eafcd0f5a133"),
		ObjectId("60e2b21608f3eafcd0f5a134"),
		ObjectId("60e2b21608f3eafcd0f5a135")
	]
}
> db.test01.find();
{ "_id" : ObjectId("60e2b19108f3eafcd0f5a131"), "name" : "name1" }
{ "_id" : ObjectId("60e2b19b08f3eafcd0f5a132"), "name" : "name2" }
{ "_id" : ObjectId("60e2b21608f3eafcd0f5a133"), "age" : 11, "name" : "ehh1" }
{ "_id" : ObjectId("60e2b21608f3eafcd0f5a134"), "isdy" : true, "name" : "hehe2" }
{ "_id" : ObjectId("60e2b21608f3eafcd0f5a135"), "sex" : "女", "name" : "呵呵呵3" }
  • 修改文档

db.集合名.udpate(条件,修改内容,{multi:true}); 修改所有符合条件的文档

db.集合名.udpate(条件,修改内容,{multi:false}); 修改第一条符合条件的文档

> db.test01.find(); #获取结合test01中所有文档
{ "_id" : ObjectId("60e2b19108f3eafcd0f5a131"), "name" : "name1" }
{ "_id" : ObjectId("60e2b19b08f3eafcd0f5a132"), "name" : "name2" }
{ "_id" : ObjectId("60e2b21608f3eafcd0f5a133"), "age" : 11, "name" : "ehh1" }
{ "_id" : ObjectId("60e2b21608f3eafcd0f5a134"), "isdy" : true, "name" : "hehe2" }
{ "_id" : ObjectId("60e2b21608f3eafcd0f5a135"), "sex" : "女", "name" : "呵呵呵3" }
{ "_id" : ObjectId("60e2b39208f3eafcd0f5a136"), "age" : 11, "name" : "ehh11" }
{ "_id" : ObjectId("60e2b39208f3eafcd0f5a137"), "age" : 13, "name" : "hehe22" }
{ "_id" : ObjectId("60e2b39208f3eafcd0f5a138"), "sex" : "女", "name" : "呵呵呵3", "age" : 19 }
{ "_id" : ObjectId("60e2b39208f3eafcd0f5a139"), "sex" : "女", "name" : "赫赫", "age" : 18 }
#更改age<18的所有记录:name值为未成年 isdy值为false
> db.test01.update({age:{$lt:18}},{$set:{name:"未成年",isdy:false}},{multi:true});
WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 3 })
> db.test01.find();
{ "_id" : ObjectId("60e2b19108f3eafcd0f5a131"), "name" : "name1" }
{ "_id" : ObjectId("60e2b19b08f3eafcd0f5a132"), "name" : "name2" }
{ "_id" : ObjectId("60e2b21608f3eafcd0f5a133"), "age" : 11, "name" : "未成年", "isdy" : false }
{ "_id" : ObjectId("60e2b21608f3eafcd0f5a134"), "isdy" : true, "name" : "hehe2" }
{ "_id" : ObjectId("60e2b21608f3eafcd0f5a135"), "sex" : "女", "name" : "呵呵呵3" }
{ "_id" : ObjectId("60e2b39208f3eafcd0f5a136"), "age" : 11, "name" : "未成年", "isdy" : false }
{ "_id" : ObjectId("60e2b39208f3eafcd0f5a137"), "age" : 13, "name" : "未成年", "isdy" : false }
{ "_id" : ObjectId("60e2b39208f3eafcd0f5a138"), "sex" : "女", "name" : "呵呵呵3", "age" : 19 }
{ "_id" : ObjectId("60e2b39208f3eafcd0f5a139"), "sex" : "女", "name" : "赫赫", "age" : 18 }
#更改age<=18并且isdy=false的第一条记录:name值为小伙子 sex为妖
> db.test01.update({age:{$lte:18},isdy:false},{$set:{name:"小伙子",sex:"妖"}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.test01.find();
{ "_id" : ObjectId("60e2b19108f3eafcd0f5a131"), "name" : "name1" }
{ "_id" : ObjectId("60e2b19b08f3eafcd0f5a132"), "name" : "name2" }
{ "_id" : ObjectId("60e2b21608f3eafcd0f5a133"), "age" : 11, "name" : "小伙子", "isdy" : false, "sex" : "妖" }
{ "_id" : ObjectId("60e2b21608f3eafcd0f5a134"), "isdy" : true, "name" : "hehe2" }
{ "_id" : ObjectId("60e2b21608f3eafcd0f5a135"), "sex" : "女", "name" : "呵呵呵3" }
{ "_id" : ObjectId("60e2b39208f3eafcd0f5a136"), "age" : 11, "name" : "未成年", "isdy" : false }
{ "_id" : ObjectId("60e2b39208f3eafcd0f5a137"), "age" : 13, "name" : "未成年", "isdy" : false }
{ "_id" : ObjectId("60e2b39208f3eafcd0f5a138"), "sex" : "女", "name" : "呵呵呵3", "age" : 19 }
{ "_id" : ObjectId("60e2b39208f3eafcd0f5a139"), "sex" : "女", "name" : "赫赫", "age" : 18 }
  • 删除文档

db.集合.remove(条件);

> db.test01.remove({sex:"女"});   #删除test01中sex=女的所有记录
WriteResult({ "nRemoved" : 3 })
> db.test01.count();   #获取集合的记录数
6
> db.test01.remove({});     # 删除test01的所有记录
WriteResult({ "nRemoved" : 6 })  
> db.test01.count();
0
  • 查询文档

db.集合.find({条件},{要查询的列})

> db.test01.find({sex:"女",name:"呵呵呵3"});  #查询sex=女并且name=呵呵呵3的所有记录的所有字段
{ "_id" : ObjectId("60e2b6da08f3eafcd0f5a13c"), "sex" : "女", "name" : "呵呵呵3" }
{ "_id" : ObjectId("60e2b6dc08f3eafcd0f5a13f"), "sex" : "女", "name" : "呵呵呵3" }
{ "_id" : ObjectId("60e2b6dd08f3eafcd0f5a142"), "sex" : "女", "name" : "呵呵呵3" }
{ "_id" : ObjectId("60e2b6de08f3eafcd0f5a145"), "sex" : "女", "name" : "呵呵呵3" }
> db.test01.find({sex:"女",name:"呵呵呵3"},{name:1,_id:1});
#查询sex=女并且name=呵呵呵3的所有记录的name和_id字段
{ "_id" : ObjectId("60e2b6da08f3eafcd0f5a13c"), "name" : "呵呵呵3" }
{ "_id" : ObjectId("60e2b6dc08f3eafcd0f5a13f"), "name" : "呵呵呵3" }
{ "_id" : ObjectId("60e2b6dd08f3eafcd0f5a142"), "name" : "呵呵呵3" }
{ "_id" : ObjectId("60e2b6de08f3eafcd0f5a145"), "name" : "呵呵呵3" }
> db.test01.find({$or:[{sex:"女"},{name:"呵呵呵3"}]},{name:1,_id:1});
#查询sex=女或者name=呵呵呵3的所有记录的name和_id字段
{ "_id" : ObjectId("60e2b6da08f3eafcd0f5a13c"), "name" : "呵呵呵3" }
{ "_id" : ObjectId("60e2b6dc08f3eafcd0f5a13f"), "name" : "呵呵呵3" }
{ "_id" : ObjectId("60e2b6dd08f3eafcd0f5a142"), "name" : "呵呵呵3" }
{ "_id" : ObjectId("60e2b6de08f3eafcd0f5a145"), "name" : "呵呵呵3" }

# 删除字段:age
# db.test01.update({ age: {$exists: true} }, {$unset: { age:null } }, { multi: true });
> db.test01.find();
{ "_id" : ObjectId("62e89bc7e4343a579fe0e41d"), "name" : "韩梅梅", "dy" : true }
{ "_id" : ObjectId("62e89c55e4343a579fe0e41e"), "name" : "韩梅梅", "dy" : true }
{ "_id" : ObjectId("62e89c56e4343a579fe0e41f"), "name" : "韩梅梅", "dy" : true }
{ "_id" : ObjectId("62e89c56e4343a579fe0e420"), "name" : "韩梅梅", "dy" : true }
> db.test01.update({ dy:{$exists: true} },{$unset:{dy:null } }, { multi: true });
WriteResult({ "nMatched" : 4, "nUpserted" : 0, "nModified" : 4 })
> db.test01.find();
{ "_id" : ObjectId("62e89bc7e4343a579fe0e41d"), "name" : "韩梅梅" }
{ "_id" : ObjectId("62e89c55e4343a579fe0e41e"), "name" : "韩梅梅" }
{ "_id" : ObjectId("62e89c56e4343a579fe0e41f"), "name" : "韩梅梅" }
{ "_id" : ObjectId("62e89c56e4343a579fe0e420"), "name" : "韩梅梅" }

五:springboot整合mongodb

准备

  • 创建项目

image-20210705161207253

  • 引入依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
  • 定义核心配置文件
spring.data.mongodb.authentication-database=admin
spring.data.mongodb.host=192.168.254.128
spring.data.mongodb.port=27017
spring.data.mongodb.username=miao
spring.data.mongodb.password=123
spring.data.mongodb.database=test00
  • 创建实体类
package com.zhiyou100.entity;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import org.springframework.data.annotation.Id;
import org.springframework.format.annotation.DateTimeFormat;

import java.io.Serializable;
import java.util.Date;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class Student implements Serializable {
    @Id   //必须指定id列
    private String sid;
    private String sname;
    private Integer sage;
    private Float score;
    @JsonFormat(pattern = "yyyy-MM-dd")  //写给json
    @DateTimeFormat(pattern = "yyyy-MM-dd")  //写给web页面
    private Date sbirthday;
}

dao层写法1:

  • dao继承接口MangodbRepository即可
package com.zhiyou100.dao;

import com.zhiyou100.entity.Student;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;

// MongoRepository<Student,String> 泛型1:行对应的对象类型 泛型2:主键列类型
@Repository
public interface StudentDao1  extends MongoRepository<Student,String> {
}
  • action
package com.zhiyou100.controller;
...
@RestController
@RequestMapping("/student1")
public class StudentController1 {

    @Autowired
    private StudentDao1 studentDao1;

    @GetMapping("/")
    public List<Student> getAll(){
        return studentDao1.findAll();
    }
    @GetMapping("/{sid}")
    public Student getOne(@PathVariable String sid){
        return studentDao1.findById(sid).orElse(new Student());
    }
    @PostMapping("/")
    public String addOne(Student s){
        return "添加:"+studentDao1.save(s);
    }
    @PutMapping("/")
    public String udpateOne(@RequestBody Student s){
        if(!studentDao1.existsById(s.getSid())){
            return "修改失败!"+s.getSid()+"不存在!";
        }
        return "修改:"+studentDao1.save(s);
    }
    @DeleteMapping("/{sid}")
    public String deleteOne(@PathVariable String sid){
        if(!studentDao1.existsById(sid)){
            return "删除失败!"+sid+"不存在!";
        }
        studentDao1.deleteById(sid);
        return "修改成功";
    }
}
  • 通过postman测试 略

dao层写法2:

  • 在是实现类中通过MongoTemplete操作数据库
package com.zhiyou100.dao.imp;

import com.zhiyou100.dao.StudentDao2;
import com.zhiyou100.entity.Student;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public class StudentDao2Imp implements StudentDao2 {
    //使用mongotimple模板类实现数据库操作
    @Autowired
    private MongoTemplate mongoTemplate;

    @Override
    public List<Student> getAll() {
        return mongoTemplate.findAll(Student.class);
    }

    @Override
    public Student getOne(String sid) {
        return mongoTemplate.findById(sid,Student.class);
    }

    @Override
    public void addOne(Student s) {
        mongoTemplate.save(s);
    }

    @Override
    public void udpateOne(Student s) {
        mongoTemplate.save(s);
    }

    @Override
    public void deleteOne(String sid) {
        Student student=mongoTemplate.findById(sid,Student.class);
        if(student!=null){
            mongoTemplate.remove(student);
        }
    }
}
  • action
package com.zhiyou100.controller;

import com.zhiyou100.dao.StudentDao1;
import com.zhiyou100.dao.StudentDao2;
import com.zhiyou100.entity.Student;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/student2")
public class StudentController2 {

    @Autowired
    private StudentDao2 studentDao2;

    @GetMapping("/")
    public List<Student> getAll(){
        return studentDao2.getAll();
    }
    @GetMapping("/{sid}")
    public Student getOne(@PathVariable String sid){
        return studentDao2.getOne(sid);
    }
    @PostMapping("/")
    public String addOne(Student s){
        studentDao2.addOne(s);
        return "添加:成功!";
    }
    @PutMapping("/")
    public String udpateOne(@RequestBody Student s){
        if(studentDao2.getOne(s.getSid())==null){
            return "修改失败!"+s.getSid()+"不存在!";
        }
        studentDao2.udpateOne(s);
        return "修改成功";
    }
    @DeleteMapping("/{sid}")
    public String deleteOne(@PathVariable String sid){
        if(studentDao2.getOne(sid)==null){
            return "删除失败!"+sid+"不存在!";
        }
        studentDao2.deleteOne(sid);
        return "删除成功";
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值