一:nosql
1.1 历史
1.2 nosql
1.3 nosql使用场景
1.4 nosql和sql的比较
1.5 nosql的四大家族
-
key-value键值型
-
document-oriented文档类型
- column-fimally 列式存储
- graph-oriented图形存储
1.6 nosql的优缺点
- 优点
1 高扩展性
2 无标准化
3 分布式计算
4 不支持复杂运算
5 底成本
- 缺点
无复杂关系
无统一sql
无事务
数据安全性差
- 使用场景
* 数据模型简单
* 表结构多变
* 查询性能要求高
* 不需要数据的高度一致性
* 给定一个关键字(key) 可以容易的获取相对复杂的值
二: mongodb
2.1 简介
MongoDB是一个基于分布式文件存储 的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
2.2 mongodb与rdbms的对比
2.3 数据类型
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 7月 5 10:14 mongodb
-rw-r--r-- 1 root root 72077387 7月 5 10:13 mongodb-linux-x86_64-rhel70-4.4.6.tgz
- 目录介绍 bin
- 创建必须要的文件/文件夹
[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 用户管理
- 进入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 集合操作
-
创建集合:
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
准备
- 创建项目
- 引入依赖
<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 "删除成功";
}
}