文章目录
文章目录
提示:本文是对尚硅谷的教案进行整理的学习笔记
一、概念
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组
1.mongoDB概念解析
SQL术语/概念 | MongoDB术语/概念 | 解析/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库/集合 |
row | document | 数据库行/文档 |
coloumn | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接,MongoDB不支持 | |
primary key | parmary key | 主键,MongoDB自动将**_id**字段设置为主键 |
2、SQL存储方式对比
3、数据库常用命令
作用 | 命令 | 解析 |
---|---|---|
创建数据库 | use test | 如果test数据库不存在则创建test数据库,否则切换 |
查询所有数据库 | show dbs | |
删除当前使用数据库 | db.dropDatabase(); | |
查看当前使用的数据库 | db.getName(); | |
显示当前db状态 | db.stats(); |
4、文档(table)
文档是一组键值(key-value)对(即BSON)。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点
下表列出了 RDBMS 与 MongoDB 对应的术语:
关系数据库 | MongoDB |
---|---|
表格 | 集合 |
行 | 文档 |
列 | 字段 |
表联合 | 嵌入文档 |
主键 | 主键(MongoDB提供了key为_id) |
需要注意的是:
1、文档中的键/值对是有序的。
2、文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。
3、MongoDB区分类型和大小写。
4、MongoDB的文档不能有重复的键。
5、文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。
文档键命名规范:
1、键不能含有\0 (空字符)。这个字符用来表示键的结尾。
2、.和$有特别的意义,只有在特定环境下才能使用。
3、以下划线"_"开头的键是保留的(不是严格要求的)。
5、集合
集合就是 MongoDB 文档组,类似于 关系数据库中的表格。
集合存在于数据库中,集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。
创建集合命令
1、 创建一个集合(table)
db.createCollection( “collName”);
2、 得到指定名称的集合(table )
db.getCollection(“user”);
6、MongoDB数据类型
数据类型 | 描述 |
---|---|
String | 字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。 |
Integer | 整型数值。用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位 |
Boolean | 布尔值 |
Double | 双精度浮点值。用于存储浮点值。 |
Min/Max keys | 将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对比 |
Arrays | 数组类型。用于将数组或列表或多个值存储为一个键 |
Timestamp | 时间戳 |
Object | 用于内嵌文档。 |
Null | 用于创建空值。 |
Symbol | 符号。该数据类型基本上等同于字符串类型,但不同的是,它一般用于采用特殊符号类型的语言。 |
Date | 日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息。 |
Object ID | 对象 ID。用于创建文档的 ID。 |
Binary Data | 二进制数据。用于存储二进制数据。 |
Code | 代码类型。用于在文档中存储 JavaScript 代码。 |
Regular expression | 正则表达式类型。用于存储正则表达式。 |
二、常用增删改查命令
INSERT
db.user.save({name:'zhangsan',age:21,sex:true})
解析:
db是关键字代表当前连接的数据库
user:集合(关系型数据库中的表table)
添加之后会自动生成_id 字段
_id是insert是MongoDB默认的字段是自动生成的
QUERY
查询全部
db.user.find()
WHERE
db.User.find({name:"zhangsan"})
# 相当于关系型数据库 select * from user where name = 'zhangsan'
查询指定字段
db.user.find({age:21}, {'name':1, 'age':1})
# select name, age from user where age = 21
排序
在 MongoDB 中使用 sort() 方法对数据进行排序,sort() 方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用于降序排列
db.user.find().sort({age:1})
分页limit()
在 MongoDB 中使用 limit()方法来读取指定数量的数据,skip()方法来跳过指定数量的数据
# 跳过第0条数据,取3条
db.user.find().skip(0).limit(3)
IN
# select * from user where age in (21, 26, 32)
> db.user.find({age:{$in:[21,26,32]}})
COUNT
# select count(*) from User where age >20
> db.user.find({age:{$gt:20}}).count()
OR
# select * from user where age = 21 or age = 28
> db.user.find({$or:[{age:21}, {age:28}]})
UPDATE
# update Userset age = 100, sex = 0 where name = 'user1'
> db.user.update({name:"zhangsan"}, {$set:{age:100, sex:0}})
解析:
Update()有几个参数需要注意
db.collection.update(criteria, objNew, upsert, mult)
- criteria:需要更新的条件表达式
- objNew:更新表达式
- upsert:如FI标记录不存在,是否插入新文档(默认false)。
- multi:是否更新多个文档。
db.user.update({name:'zhangsan'}, {$set:{age:18}},{multi:true})
# 更新一条或者多条由multi控制
REMOVE
db.user.remove(id)
db.user.remove({})
//移除所有,可以在里面写条件
三、Spring boot 集成mongodb
spring-data-mongodb提供了MongoTemplate与MongoRepository两种方式访问mongodb,MongoRepository操作简单,MongoTemplate操作灵活
基于MongoRepository开发CRUD
1、引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
1.1配置文件配置mongodb地址
spring.data.mongodb.uri=mongodb://localhost:27017/test
spring.data.mongodb.username=root
spring.data.mongodb.password=123
# 账号和密码没有可以不填test是数据库名称
2、定义实体类
@Document("user")
public class User {
@Id
private String id;
private String name;
private Integer age;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
3、实现
Spring Data提供了对mongodb数据访问的支持,我们只需要继承MongoRepository类,按照Spring Data规范就可以了
1、不是随便声明的,而需要符合一定的规范
2、 查询方法以find | read | get开头
3、 涉及条件查询时,条件的属性用条件关键字连接
4、 要注意的是:条件属性首字母需要大写
5、 支持属性的级联查询,但若当前类有符合条件的属性则优先使用,而不使用级联属性,若需要使用级联属性,则属性之间使用_强制进行连接
4、dao层继承MongoRepository类
@Repository
public interface UserRepository extends MongoRepository<User,String> {
}
5、测试
保存
User user = new User();
user.setAge(20);
user.setName("张三");
// 返回新增成功的对象,id不用写,mongodb会自动生成
User user1 = userRepository.save(user);
查询所有
List<User> all = userRepository.findAll();
System.out.println(all);
按照ID查询
User user = userRepository.findById("62dd301aa8721e2503a0acb3").get();
System.out.println(user);
条件查询
User user = new User();
user.setAge(50);
Example<User> userExample = Example.of(user);
List<User> userList = userRepository.findAll(userExample);
模糊查询
//创建匹配器,即如何使用查询条件
ExampleMatcher matcher = ExampleMatcher.matching() //构建对象
.withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING) //改变默认字符串匹配方式:模糊查询
.withIgnoreCase(true); //改变默认大小写忽略方式:忽略大小写
User user = new User();
user.setName("三");
Example<User> userExample = Example.of(user, matcher);
List<User> userList = userRepository.findAll(userExample);
分页查询
// 构建排序
Sort sort = Sort.by(Sort.Direction.DESC, "age");
// 构建分页对象,0为第一页
Pageable pageable = PageRequest.of(0, 10, sort);
//创建匹配器,即如何使用查询条件
ExampleMatcher matcher = ExampleMatcher.matching() //构建对象
.withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING) //改变默认字符串匹配方式:模糊查询
.withIgnoreCase(true); //改变默认大小写忽略方式:忽略大小写
User user = new User();
user.setName("三");
//创建实例
Example<User> example = Example.of(user, matcher);
Page<User> pages = userRepository.findAll(example, pageable);
修改
User user = userRepository.findById("62dd301aa8721e2503a0acb3").get();
user.setName("张三");
user.setAge(25);
User save = userRepository.save(user);
删除
userRepository.deleteById("62dd2f4ba477ef59af4602cd");
user.setName("三");
//创建实例
Example<User> example = Example.of(user, matcher);
Page<User> pages = userRepository.findAll(example, pageable);
修改
User user = userRepository.findById("62dd301aa8721e2503a0acb3").get();
user.setName("张三");
user.setAge(25);
User save = userRepository.save(user);
删除
userRepository.deleteById("62dd2f4ba477ef59af4602cd");