什么是MongoDB?
MongoDB是一种开源的 分布式文档型数据库管理系统 ,它使用类似于JSON的BSON格式(Binary JSON)来存储数据。
MongoDB使用集合(Collections)来组织文档(Documents),每个文档都是由键值对组成的。
- 数据库(Database):存储数据的容器,类似于关系型数据库中的数据库。
- 集合(Collection):数据库中的一个集合,类似于关系型数据库中的表。
- 文档(Document):集合中的一个数据记录,类似于关系型数据库中的行(row),以 BSON 格式存储。
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成,文档类似于 JSON 对象,字段值可以包含其他文档,数组及文档数组:
使用场景:
使用场景 | |
---|---|
网站数据存储 | 游戏开发 |
物流与电商 | 社交网络 |
内容管理系统 | 视频直播和流媒体 |
缓存系统 | 大数据分析 |
Spring Boot整合MongoDB
- 引用依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
- 配置连接信息
# MongoDB连接信息
# 配置IP
spring.data.mongodb.host = 192.168.23.27
# 配置端口号
spring.data.mongodb.port = 27017
# 定义连接的数据库名
spring.data.mongodb.database = mall
#用于控制MongoDB数据库是否自动创建索引。
spring.data.mongodb.auto-index-creation = true
- 定义实体类Person
@Document(collection = "person") // 指定集合名称,就是类似mysql的表,如果不指定就以类名称作为集合名称
@Data
public class Person {
@Id // 文档id, 很重要,类似mysql表的主键
private String id;
private String name;
private Integer age;
}
使用MongoDB
1.新增文档
注入MongoDb操作类,其中封装DML、DQL等操作
@Autowired
private MongoTemplate mongoTemplate;
添加单条数据:
//填充数据
Person person =new Person();
person.setId("1");
person.setName("张三");
person.setAge(26);
//插入数据
mongoTemplate.insert(person);
添加多条数据:
List<Person> list = new ArrayList<>();
for (int i = 0; i < 20; i++) {
Person person = new Person();
person.setName("张三" + i);
person.setAge(20+i);
list.add(person);
}
//批量添加数据
Collection<Person> people = mongoTemplate.insertAll(list);
存储文档,如果没有该数据就插入,否则更新数据:
/**
* 存储文档,如果没有该数据就插入,否则更新数据
* 在存储文档的时候会通过主键 ID 进行判断,如果存在就更新,否则就插入
*/
@Test
public void save() throws Exception {
//填充数据
Person person =new Person();
person.setId("1");
person.setName("张三");
person.setAge(26);
//存储数据
mongoTemplate.save(person);
}
2.修改文档
根据条件修改数据:
//设置修改条件
Query query = new Query();
Criteria criteria = Criteria.where("name").is("张三");
query.addCriteria(criteria);
//设置修改的数据
Update update = new Update();
update.set("name", "李四");
//执行修改操作
UpdateResult updateResult = template.updateFirst(query, update, Person.class);
3.删除文档
删除指定文档:
//设置删除条件
Query query = new Query();
Criteria name = new Criteria().and("name").is("张三1");
Criteria age = new Criteria().and("age").is(26);
query.addCriteria(name);
query.addCriteria(age);
//执行删除操作
Person person = mongoTemplate.findAndRemove(query, Person.class);
删除符合条件的所有文档,并返回删除的文档:
// 使用 in 删除 符合条件的多条文档,并返回
Query query = new Query(Criteria.where("id").in(1,2,3));
List<Person> result = mongoTemplate.findAllAndRemove(query, Person.class);
4.查询文档
MongoDB 支持的多种操作符:
查询集合中的全部文档数据:
List<Person> result = mongoTemplate.findAll(Person.class);
查询集合中指定的ID文档数据:
Person result = mongoTemplate.findById("1", Person.class);
根据条件查询集合中符合条件的文档,返回第一条数据:
//查询name是"张三3"的Person
Query query = new Query(Criteria.where("name").is("张三3"));
Person result = mongoTemplate.findOne(query, Person.class);
根据条件查询所有符合条件的文档:
//查询age大于18的Person
Query query = new Query(Criteria.where("age").gt(18));
List<Person> result = mongoTemplate.find(query, Person.class);
据【AND】关联多个查询条件,查询集合中所有符合条件的文档数据:
// 创建条件
Criteria name = Criteria.where("name").is("张三");
Criteria age = Criteria.where("age").is(18);
// 创建条件对象,将上面条件进行 AND 关联 where name='张三' and age = 18
Criteria criteria = new Criteria().andOperator(name, age);
// 创建查询对象,然后将条件对象添加到其中
Query query = new Query(criteria);
List<Person> result = mongoTemplate.find(query, Person.class);
System.out.println("查询结果:" + result.toString());
根据【OR】关联多个查询条件,查询集合中的文档数据:
// 创建条件
Criteria criteriaUserName = Criteria.where("name").is("张三");
Criteria criteriaPassWord = Criteria.where("age").is(22);
// 创建条件对象,将上面条件进行 OR 关联 where name='张三' or age = 22
Criteria criteria = new Criteria().orOperator(criteriaUserName, criteriaPassWord);
// 创建查询对象,然后将条件对象添加到其中
Query query = new Query(criteria);
List<Person> result = mongoTemplate.find(query, Person.class);
System.out.println("查询结果:" + result.toString());
根据【IN】关联多个查询条件,查询集合中的文档数据:
// 设置查询条件参数
List<Long> ids = Arrays.asList("1", "2", "3");
// 创建条件
Criteria criteria = Criteria.where("id").in(ids);
// 创建查询对象,然后将条件对象添加到其中
Query query = new Query(criteria);
List<Person> result = mongoTemplate.find(query, Person.class);
System.out.println("查询结果:" + result.toString());
根据【逻辑运算符】查询集合中的文档数据:
// 设置查询条件参数
int min = 20;
int max = 35;
Criteria criteria = Criteria.where("age").gt(min).lte(max);
// 创建查询对象,然后将条件对象添加到其中
Query query = new Query(criteria);
List<Person> result = mongoTemplate.find(query, Person.class);
System.out.println("查询结果:" + result.toString());
根据【正则表达式】查询集合中的文档数据:
// 设置查询条件参数
String regex = "^张";
Criteria criteria = Criteria.where("name").regex(regex);
// 创建查询对象,然后将条件对象添加到其中
Query query = new Query(criteria);
List<Person> result = mongoTemplate.find(query, Person.class);
System.out.println("查询结果:" + result.toString());
5.创建索引
创建升序索引:
// 设置字段名称
String field = "age";
// 创建索引
mongoTemplate.getCollection("person").createIndex(Indexes.descending(field));
根据索引名称移除索引:
// 设置字段名称
String field = "age_1";
// 删除索引
mongoTemplate.getCollection("person").dropIndex(field);
查询集合中所有的索引:
// 获取集合中所有列表
ListIndexesIterable<Document> indexList = mongoTemplate.getCollection("person").listIndexes();
// 获取集合中全部索引信息
for (Document document : indexList) {
System.out.println("索引列表:" + document);
}