MongoDB全教程
安装
第一步:
安装mongodb,地址:https://www.mongodb.com/try/download/community
第二步:这里我选择的是6.0版本,6.0版本另外需要安装一个mongoshell。(6.0以下版本无需安装mongoshell)
地址:https://www.mongodb.com/try/download/shell
第三步:将mongoshell解压到mongodb的bin目录下。
第四步:配置环境变量
将mongodb的bin路径复制到系统变量path中。
第五步:在mongodb目录中的data文件夹下创建db文件夹。
启动服务
手动启动服务
开启一个黑窗口输入如下指令
mongod --dbpath D:\ruanjian\mongodb\data\db
再开启一个黑窗口进入到mongoshell的bin目录下输入如下指令(6.0以下版本输入mongodb的bin路径下的mongo命令即可)
mongosh
设置开机自启动服务
在mongodb6.0版本中默认为我们开启了自启动,如<6.0则需手动配置。
1.找到mongodb的bin文件夹所在的位置,在bin所在的同目录下创建mongod.cfg,并编写如下:
systemLog:
destination:file
path:D:\ruanjian\mongodb\log\mongod.log
storage:
dbPath:D:\ruanjian\mongodb\data\db
2.以管理员身份打开cmd执行如下命令:
sc.exe create MongoDB binPath=""D:\ruanjian\mongodb\bin\mongod.exe" --service --config="D:\ruanjian\mongodb\bin\mongod.cfg"" DisplayName="MongoDB" start="auto"
3.打开服务找到mongodb并启动
基本概念
数据库(database)
集合(collection)
文档(document)
-在Mongodb中,我们不需要手动去创建数据库和集合,当我们创建文档时,如果数据库或集合不存在则会自动创建数据库或集合。
基本指令
show dbs 显示所有的数据库
use 数据库名 切换数据库
db 查看当前数据库
show collections 显示当前数据库中所有的集合
MongoDB的增删改查操作
插入
在插入一个对象时,如果我们没有添加 _id 属性,则会自动生成一个_id,该id为文档的唯一标识。
单条插入
语法:db..insertOne(document)、db..insert(document)
方案一:
代码演示:
//进入到test数据库
use test;
//向test数据库中的users集合插入一个对象
db.users.insert({name:"陈宫",gender:"男",age:33})
方案二:
代码演示:
db.users.insertOne({name:"陈宫",gender:"男",age:33})
批量添加
语法:db..insert、db..insertMany
方案一:
db.users.insert([
{name:"张辽",gender:"男",age:28},
{name:"张郃",gender:"男",age:33},
{name:"徐晃",gender:"男",age:35},
{name:"乐进",gender:"男",age:32},
{name:"于禁",gender:"男",age:30}
])
方案二:
db.users.insertMany([
{name:"张辽",gender:"男",age:28},
{name:"张郃",gender:"男",age:33},
{name:"徐晃",gender:"男",age:35},
{name:"乐进",gender:"男",age:32},
{name:"于禁",gender:"男",age:30}
])
这两者的效果都是一样的。
删除
删除单条
语法:db..remove()、db..deleteOne()
方案一:
//该方法表示将name为张辽的所有文档查询出来并删除。
//默认会将查询出来的多个文档删除,但我们给参数2传入一个true就只会删除第一个。
db.users.remove({name:"张辽"},true)
//除此之外我们还可以传入其他条件。
//删除name为 ”张辽“、”张郃“ 的文档。
db.users.remove({name:{$in:["张辽","张郃"]}})
方案二:
db.users.deleteOne({name:"张辽"})
删除多条
语法:db..insert、db..deleteMany()
方案一:
//remove方法默认删除查询出来的所有文档
db.users.remove({name:"张辽"})
方案二:
db.users.deleteMany({name:"张辽"})
清空集合
将集合中所有的文档删除。
语法:db..drop()
代码演示:
db.users.drop()
删除数据库
db.dropDatabase()
修改
修改单个
语法:db..update()、db..updateOne()
注:当我们在修改某个不存在的属性时,会为我们自动创建该属性
方案一:
//update方法默认为修改第一个文档,但在将参数三multi属性设置为true则表示开启修改多个
db.users.update({_id:ObjectId("635e39d3ae37000058005092")}, {$set:{age:36}})
方案二:
db.users.updateOne({_id:ObjectId("635e39d3ae37000058005092")}, {$set:{age:30}})
修改多个
语法:db..update()、db..updateMany()
方案一:
//update方法默认为修改第一个文档,但在将参数三multi属性设置为true则表示开启修改多个
db.users.update({name:"张辽"}, {$set:{age:36}},{multi:true})
方案二:
db.users.updateMany({name:"张辽"}, {$set:{age:36}})
替换文档
将一个对象替换为指定的对象。
语法:db..update({xxx},{xxx})、db..replaceOne()
代码演示:
//表示将name为张辽的文档对象替换为 参数二的中的文档对象
db.users.update({name:"张辽"}, {name:"许褚",age:36})
//表示将name为张辽的文档对象替换为 参数二的中的文档对象
db.users.replaceOne({name:"张辽"}, {name:"许褚",age:36})
删除属性
删除文档中的某个属性
语法:db..update({xxx},{$unset:{xxx}})
代码演示:
//表示将id为6360c38ee1670000aa00061a文档对象的age属性删除,$unset:{age:00}中age的属性值不管填什么都会将其删除,所以age值随意填写即可。
db.users.updateOne({_id:ObjectId("6360c38ee1670000aa00061a")}, {$unset:{age:00}})
向数组中添加元素
用于向文档中数组属性添加元素
语法:db.users.update({xxx},{KaTeX parse error: Expected 'EOF', got '}' at position 11: push:{xxx}}̲)、db.users.upda…addToSet:{xxx}})
代码演示:
//向users集合中的hobby属性中的movies数组添加一个元素
db.users.update({name:"张郃"},{$push:{"hobby.movies":"火影忍者"}})
示例2:
//向users集合中的hobby属性中的movies数组添加一个元素,如果该元素在集合中已存在则不添加
db.users.update({name:"张郃"},{$addToSet:{"hobby.movies":"火影忍者"}})
自增/减
//将name为张辽的文档对象的age属性+30
db.users.update({name:"张辽"}, {$inc:{age:30}})
//将name为张辽的文档对象的age属性-30
db.users.update({name:"张辽"}, {$inc:{age:-30}})
查询
语法:db..find()
条件查询
- $eq 等于
- $ne 不等于
- $gt 大于
- $gte 大于等于
- $lt 小于
- $lte 小于等于
- $in 包含
- $nin 不包含
代码示例:
//当传入一个空对象时,表示查询所有。
db.users.find({})
//查询name为张辽、张郃的文档对象
db.users.find({name:{$in:["张辽","张郃"]}})
//查询age大于30的文档对象
db.users.find({age:{$gt:30}})
查询个数
db.users.find().count()
分页查询
语法:db..find().skip().limit()
代码示例:
//跳过3条记录,并输出10条
db.users.find().skip(3).limit(10)
模糊查询
在mongodb中模糊查询是用正则表达式来查的。
$regex: 正则,用于模糊查询。
使用$regex时,有以下几种用法:
{ : { $regex: /pattern/, $options: ‘’ } }
{ : { $regex: ‘pattern’, $options: ‘’ } }
{ : { $regex: /pattern/ } }
option参数的含义:
- i 大小写不敏感
- m 查询匹配中使用了锚,例如^(代表开头)和$(代表结尾),以及匹配\n后的字符串
- x 忽视所有空白字符。 要求 r e g e x 与 regex与 regex与option合用
- s 允许点字符(.)匹配所有的字符,包括换行符。 要求 r e g e x 与 regex与 regex与option合用
代码示例:
//查询name中包含侯的文档对象
db.users.find({name:{$regex:/^.*侯.*$/,$options:"si"}});
//查询name以 “辽” 结尾的文档对象
db.users.find({name:{$regex:/^.*辽$/}})
排序
语法:db..find().sort(xxx:1,xxx-1)
sort()以指定属性为规则来进行排序,sort()中需要传入一个或两个属性来指定排序规则,1表示升序,-1表示降序,当用参数1进行排序后如果相等则以参数2的排序规则进行排序。
代码示例:
db.users.find({}).sort({age:1,num:-1})
投影
用来指定需要显示哪些属性或不显示哪些属性,1表示显示该属性,0表示不显示该属性
语法:db..find({},{_id:0,name:1,age:1})
//返回name、age属性
db.users.find({},{_id:0,name:1,age:1})
文档之间的关系
一对一
//将曹操妻子的id存入到变量
var wid = db.husband.find({name:"曹操"}).wid()
//通过id查出曹操的妻子
db.wife.find({_id:ObjectId(wid)})
一对多
//将曹操的id查询出来赋值到变量中
var uid = db.users.findOne({name:"曹操"})._id;
//通过id查询到曹操所有的订单
db.order.find({uid:uid});
Springboot集成MongoDB
第一步:引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
第二步:配置数据库连接信息
# 登录用户所在的数据库
spring.data.mongodb.authentication-database=test
# 数据库的ip地址
spring.data.mongodb.host=localhost
# MongoDB端口号
spring.data.mongodb.port=27017
# 用户账号
#spring.data.mongodb.username=admin
#
# 用户密码
#spring.data.mongodb.password=123456
# 指定使用的数据库
# 不必预先创建,不存在该数据库会自动创建
spring.data.mongodb.database=test
第三步:创建对应的实体类,并在类上标注注解@Document()指定要操作的集合
@Data
@Document("users")
public class User {
private String _id;
private String name;
private String gender;
private Integer age;
private Object hobbies;
}
第四步:声明MongoTemplate
@SpringBootTest(classes = Mongodb01Application.class)
class Mongodb01ApplicationTests {
@Autowired
MongoTemplate mongoTemplate;
@Test
void contextLoads() {
Query query = new Query();
query.addCriteria(Criteria.where("name").is("曹操"));
List<User> users = mongoTemplate.find(query, User.class);
System.out.println(users);
}
}
模糊查询
//完全匹配
Pattern pattern = Pattern.compile("^" + "辽" + "$");
//右匹配
Pattern pattern = Pattern.compile("^.*" + "辽" + "$");
//左匹配
Pattern pattern = Pattern.compile("^" + "辽" + ".*$");
//模糊匹配
Pattern pattern = Pattern.compile("^.*" + "辽" + ".*$");
Query query = Query.query(Criteria.where(name).regex(pattern));
List<User> users = mongoTemplate.find(query, User.class, classname);
//键为”user“包含”辽“的数据
Query query = new Query();
Criteria criteria = new Criteria();
criteria.and("user").regex(pattern);
query.addCriteria(criteria);