package com.mongo.springbootmongo;
import com.mongo.springbootmongo.model.Status;
import com.mongo.springbootmongo.model.User;
import com.mongodb.client.ListIndexesIterable;
import com.mongodb.client.model.Filters;
import com.mongodb.client.model.IndexOptions;
import com.mongodb.client.model.Indexes;
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.UpdateResult;
import lombok.extern.slf4j.Slf4j;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.AggregationOperation;
import org.springframework.data.mongodb.core.aggregation.AggregationResults;
import org.bson.Document;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.*;
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
@Slf4j
public class SpringbootMongoApplicationTests {
private final String COLLECTION_NAME = "user";
@Autowired
private MongoTemplate mongoTemplate;
/**
* 创建【集合】
*
*/
@Test
public void createCollection(){
mongoTemplate.createCollection(COLLECTION_NAME);
}
/**
* 执行获取集合名称列表
*
*/
@Test
public void getCollectionNames() {
Set<String> collectionNames = mongoTemplate.getCollectionNames();
Assert.assertTrue(collectionNames.size() > 0 );
}
/**
* 检测集合【是否存在】
*
*/
@Test
public void existsCollection() {
boolean user = mongoTemplate.collectionExists(COLLECTION_NAME);
Assert.assertTrue(user);
}
/**
* 删除【集合】
*
*/
@Test
public void dropCollection() {
mongoTemplate.dropCollection(COLLECTION_NAME);
}
/**
* 插入【一条】文档数据,如果文档信息已经【存在就抛出异常】
*
*/
@Test
public void insert() {
// 设置用户信息
User user = new User()
.setId("10")
.setAge(22)
.setSex("男")
.setRemake("无")
.setSalary(1500)
.setName("zhangsan")
.setBirthday(new Date())
.setStatus(new Status().setHeight(180).setWeight(150));
// 插入一条用户数据,如果文档信息已经存在就抛出异常
mongoTemplate.insert(user, COLLECTION_NAME);
}
/**
* 插入【多条】文档数据,如果文档信息已经【存在就抛出异常】
*
*
*/
@Test
public void insertMany(){
// 设置两个用户信息
User user1 = new User()
.setId("10")
.setAge(22)
.setSex("男")
.setRemake("无")
.setSalary(1500)
.setName("shiyi")
.setBirthday(new Date())
.setStatus(new Status().setHeight(180).setWeight(150));
User user2 = new User()
.setId("12")
.setAge(22)
.setSex("男")
.setRemake("无")
.setSalary(1500)
.setName("shier")
.setBirthday(new Date())
.setStatus(new Status().setHeight(180).setWeight(150));
// 使用户信息加入结合
List<User> userList = new ArrayList<>();
userList.add(user1);
userList.add(user2);
// 插入一条用户数据,如果某个文档信息已经存在就抛出异常
Collection<User> newUserList = mongoTemplate.insert(userList, COLLECTION_NAME);
}
/**
* 存储【一条】用户信息,如果文档信息已经【存在就执行更新】
*
*/
@Test
public void save() {
// 设置用户信息
User user = new User()
.setId("13")
.setAge(22)
.setSex("男")
.setRemake("无")
.setSalary(2800)
.setName("kuiba")
.setBirthday(new Date())
.setStatus(new Status().setHeight(169).setWeight(150));
// 存储用户信息,如果文档信息已经存在就执行更新
mongoTemplate.save(user, COLLECTION_NAME);
}
/**
* 查询集合中的【全部】文档数据
*
*/
@Test
public void findAll() {
// 执行查询集合中全部文档信息
List<Status> statusList = mongoTemplate.findAll(Status.class);
List<User> documentList = mongoTemplate.findAll(User.class, COLLECTION_NAME);
// 输出结果
for (User user : documentList) {
log.info("用户信息:{}", user);
}
}
/**
* 根据【文档ID】查询集合中文档数据
*
* @return 文档信息
*/
@Test
public void findById() {
// 设置查询的文档 ID
String id = "10";
// 根据文档ID查询集合中文档数据,并转换为对应 Java 对象
User user = mongoTemplate.findById(id, User.class, COLLECTION_NAME);
// 输出结果
log.info("用户信息:{}", user);
}
/**
* 根据【条件】查询集合中【符合条件】的文档,只取【第一条】数据
*
* @return 符合条件的第一条文档
*/
@Test
public void findOne() {
// 设置查询条件参数
int age = 22;
// 创建条件对象
Criteria criteria = Criteria.where("age").is(age);
// 创建查询对象,然后将条件对象添加到其中
Query query = new Query(criteria);
// 查询一条文档,如果查询结果中有多条文档,那么就取第一条
User user = mongoTemplate.findOne(query, User.class, COLLECTION_NAME);
// 输出结果
log.info("用户信息:{}", user);
}
/**
* 根据【条件】查询集合中【符合条件】的文档,获取其【文档列表】并【排序】
*
*/
@Test
public void findByCondition() {
// 设置查询条件参数
// 创建条件对象
String sort = "age";
Criteria criteria = Criteria.where("sex").is("女");
// 创建查询对象,然后将条件对象添加到其中
Query query = new Query(criteria).with(Sort.by(sort));
// 查询一条文档,如果查询结果中有多条文档,那么就取第一条
User user = mongoTemplate.findOne(query, User.class, COLLECTION_NAME);
// 输出结果
log.info("用户信息:{}", user);
}
/**
* 根据【单个条件】查询集合中的文档数据,并【按指定字段进行排序】与【限制指定数目】
*
*/
@Test
public void findByConditionAndSortLimit() {
// 设置查询条件参数
String sex = "男";
String sort = "age";
int limit = 2;
// 创建条件对象
Criteria criteria = Criteria.where("sex").is(sex);
// 创建查询对象,然后将条件对象添加到其中
Query query = new Query(criteria).with(Sort.by(sort)).limit(limit);
// 执行查询
List<User> documentList = mongoTemplate.find(query, User.class, COLLECTION_NAME);
// 输出结果
for (User user : documentList) {
log.info("用户信息:{}", user);
}
}
/**
* 根据【单个条件】查询集合中的文档数据,并【按指定字段进行排序】与【并跳过指定数目】
*
*/
@Test
public void findByConditionAndSortSkip() {
// 设置查询条件参数
String sex = "男";
String sort = "age";
int skip = 1;
// 创建条件对象
Criteria criteria = Criteria.where("sex").is(sex);
// 创建查询对象,然后将条件对象添加到其中
Query query = new Query(criteria).with(Sort.by(sort)).skip(skip);
// 查询并返回结果
List<User> documentList = mongoTemplate.find(query, User.class, COLLECTION_NAME);
// 输出结果
for (User user : documentList) {
log.info("用户信息:{}", user);
}
}
/**
* 查询【存在指定字段名称】的文档数据
*
*/
@Test
public void findByExistsField() {
// 设置查询条件参数
String field = "sex";
// 创建条件
Criteria criteria = Criteria.where(field).exists(true);
// 创建查询对象,然后将条件对象添加到其中
Query query = new Query(criteria);
// 查询并返回结果
List<User> documentList = mongoTemplate.find(query, User.class, COLLECTION_NAME);
// 输出结果
for (User user : documentList) {
log.info("用户信息:{}", user);
}
}
/**
* 根据【AND】关联多个查询条件,查询集合中的文档数据
*
*/
@Test
public void findByAndCondition() {
// 设置查询条件参数
String sex = "男";
Integer age = 22;
// 创建条件
Criteria criteriaSex = Criteria.where("sex").is(sex);
Criteria criteriaAge = Criteria.where("age").is(age);
// 创建条件对象,将上面条件进行 AND 关联
Criteria criteria = new Criteria().andOperator(criteriaSex, criteriaAge);
// 创建查询对象,然后将条件对象添加到其中
Query query = new Query(criteria);
// 查询并返回结果
List<User> documentList = mongoTemplate.find(query, User.class, COLLECTION_NAME);
}
/**
* 更新集合中【匹配】查询到的第一条文档数据,如果没有找到就【创建并插入一个新文档】
*
*/
@Test
public void update() {
// 创建条件对象
Criteria criteria = Criteria.where("age").is(30);
// 创建查询对象,然后将条件对象添加到其中
Query query = new Query(criteria);
// 创建更新对象,并设置更新的内容
Update update = new Update().set("age", 33).set("name", "zhangsansan");
// 执行更新,如果没有找到匹配查询的文档,则创建并插入一个新文档
UpdateResult result = mongoTemplate.upsert(query, update, User.class, COLLECTION_NAME);
// 输出结果信息
String resultInfo = "匹配到" + result.getMatchedCount() + "条数据,对第一条数据进行了更改";
log.info("更新结果:{}", resultInfo);
}
/**
* 更新集合中【匹配】查询到的【文档数据集合】中的【第一条数据】
*
*/
@Test
public void updateFirst() {
// 创建条件对象
Criteria criteria = Criteria.where("name").is("zhangsan");
// 创建查询对象,然后将条件对象添加到其中,并设置排序
Query query = new Query(criteria).with(Sort.by("age").ascending());
// 创建更新对象,并设置更新的内容
Update update = new Update().set("age", 30).set("name", "zhangsansan");
// 执行更新
UpdateResult result = mongoTemplate.updateFirst(query, update, User.class, COLLECTION_NAME);
// 输出结果信息
String resultInfo = "共匹配到" + result.getMatchedCount() + "条数据,修改了" + result.getModifiedCount() + "条数据";
log.info("更新结果:{}", resultInfo);
}
/**
* 更新【匹配查询】到的【文档数据集合】中的【所有数据】
*
* @return 执行更新的结果
*/
@Test
public void updateMany() {
// 创建条件对象
Criteria criteria = Criteria.where("age").gt(28);
// 创建查询对象,然后将条件对象添加到其中
Query query = new Query(criteria);
// 设置更新字段和更新的内容
Update update = new Update().set("age", 29).set("salary", "1999");
// 执行更新
UpdateResult result = mongoTemplate.updateMulti(query, update, User.class, COLLECTION_NAME);
// 输出结果信息
String resultInfo = "总共匹配到" + result.getMatchedCount() + "条数据,修改了" + result.getModifiedCount() + "条数据";
log.info("更新结果:{}", resultInfo);
}
/**
* 删除集合中【符合条件】的【一个]或[多个】文档
*
* @return 删除用户信息的结果
*/
@Test
public void remove() {
// 设置查询条件参数
int age = 30;
String sex = "男";
// 创建条件对象
Criteria criteria = Criteria.where("age").is(age).and("sex").is(sex);
// 创建查询对象,然后将条件对象添加到其中
Query query = new Query(criteria);
// 执行删除查找到的匹配的全部文档信息
DeleteResult result = mongoTemplate.remove(query, COLLECTION_NAME);
// 输出结果信息
String resultInfo = "成功删除 " + result.getDeletedCount() + " 条文档信息";
log.info(resultInfo);
}
/**
* 删除【符合条件】的【单个文档】,并返回删除的文档。
*
* @return 删除的用户信息
*/
@Test
public void findAndRemove() {
// 设置查询条件参数
String name = "zhangsansan";
// 创建条件对象
Criteria criteria = Criteria.where("name").is(name);
// 创建查询对象,然后将条件对象添加到其中
Query query = new Query(criteria);
// 执行删除查找到的匹配的第一条文档,并返回删除的文档信息
User result = mongoTemplate.findAndRemove(query, User.class, COLLECTION_NAME);
// 输出结果信息
String resultInfo = "成功删除文档信息,文档内容为:" + result;
log.info(resultInfo);
}
/**
* 删除【符合条件】的【全部文档】,并返回删除的文档。
*
*/
@Test
public void findAllAndRemove() {
// 设置查询条件参数
int age = 22;
// 创建条件对象
Criteria criteria = Criteria.where("age").is(age);
// 创建查询对象,然后将条件对象添加到其中
Query query = new Query(criteria);
// 执行删除查找到的匹配的全部文档,并返回删除的全部文档信息
List<User> resultList = mongoTemplate.findAllAndRemove(query, User.class, COLLECTION_NAME);
// 输出结果信息
String resultInfo = "成功删除文档信息,文档内容为:" + resultList;
log.info(resultInfo);
}
/**
* $project: 可以从文档中选择想要的字段,和不想要的字段(指定的字段可以是来自输入文档或新计算字段的现有字段 ,也可以通过管道表达式进行一些复杂的操作,例如数学操作,日期操作,字符串操作,逻辑操作。
* $match: 用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。
* $limit: 用来限制MongoDB聚合管道返回的文档数。
* $skip: 在聚合管道中跳过指定数量的文档,并返回余下的文档。
* $unwind: 将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
* $group: 将集合中的文档分组,可用于统计结果。
* $sort: 将输入文档排序后输出。
*
* 使用管道操作符 $group 结合 $count 方法进行聚合统计
*
*/
@Test
public void aggregationGroupCount() {
// 使用管道操作符 $group 进行分组,然后统计各个组的文档数量
AggregationOperation group = Aggregation.group("age").count().as("numCount");
// 将操作加入到聚合对象中
Aggregation aggregation = Aggregation.newAggregation(group);
// 执行聚合查询
AggregationResults<Map> results = mongoTemplate.aggregate(aggregation, COLLECTION_NAME, Map.class);
for (Map result : results.getMappedResults()) {
log.info("{}", result);
}
}
/**
* 使用 $group 和 $sort 聚合,先使用 $group 进行分组,然后再使用 $sort 排序
*
*/
@Test
public void aggregateGroupSort() {
// 设置聚合条件,按岁数分组,然后统计每组用户工资最大值和用户数,按每组用户工资最大值升序排序
AggregationOperation group = Aggregation.group("age")
.max("salary").as("ageSalary")
.count().as("ageCount");
AggregationOperation sort = Aggregation.sort(Sort.by("ageSalary").ascending());
// 将操作加入到聚合对象中
Aggregation aggregation = Aggregation.newAggregation(group, sort);
// 执行聚合查询
AggregationResults<Map> results = mongoTemplate.aggregate(aggregation, COLLECTION_NAME, Map.class);
for (Map result : results.getMappedResults()) {
log.info("{}", result);
}
}
/**
* 使用 $group 和 $limit 聚合,先使用 $group 进行分组,然后再使用 $limit 限制一定数目文档
*
*/
@Test
public void aggregateGroupLimit() {
// 设置聚合条件,先按岁数分组,然后求每组用户的工资总数、最大值、最小值、平均值,限制只能显示五条
AggregationOperation group = Aggregation.group("age")
.sum("salary").as("sumSalary")
.max("salary").as("maxSalary")
.min("salary").as("minSalary")
.avg("salary").as("avgSalary");
AggregationOperation limit = Aggregation.limit(5L);
// 将操作加入到聚合对象中
Aggregation aggregation = Aggregation.newAggregation(group, limit);
// 执行聚合查询
AggregationResults<Map> results = mongoTemplate.aggregate(aggregation, COLLECTION_NAME, Map.class);
for (Map result : results.getMappedResults()) {
log.info("{}", result);
}
}
/**
* 使用 $group 和 $skip 聚合,先使用 $group 进行分组,然后再使用 $skip 跳过一定数目文档
*
*/
@Test
public void aggregateGroupSkip() {
// 设置聚合条件,先按岁数分组,然后求每组用户的工资总数、最大值、最小值、平均值,跳过前 2 条
AggregationOperation group = Aggregation.group("age")
.sum("salary").as("sumSalary")
.max("salary").as("maxSalary")
.min("salary").as("minSalary")
.avg("salary").as("avgSalary");
AggregationOperation limit = Aggregation.skip(2L);
// 将操作加入到聚合对象中
Aggregation aggregation = Aggregation.newAggregation(group, limit);
// 执行聚合查询
AggregationResults<Map> results = mongoTemplate.aggregate(aggregation, COLLECTION_NAME, Map.class);
for (Map result : results.getMappedResults()) {
log.info("{}", result);
}
}
/**
* 使用 $group 和 $project 聚合,先使用 $group 进行分组,然后再使用 $project 限制显示的字段
*
*/
@Test
public void aggregateGroupProject() {
// 设置聚合条件,按岁数分组,然后求每组用户工资最大值、最小值,然后使用 $project 限制值显示 salaryMax 字段
AggregationOperation group = Aggregation.group("age")
.max("salary").as("maxSalary")
.min("salary").as("minSalary");
AggregationOperation project = Aggregation.project("maxSalary");
// 将操作加入到聚合对象中
Aggregation aggregation = Aggregation.newAggregation(group, project);
// 执行聚合查询
AggregationResults<Map> results = mongoTemplate.aggregate(aggregation, COLLECTION_NAME, Map.class);
for (Map result : results.getMappedResults()) {
log.info("{}", result);
}
}
/**
* 使用 $group 和 $unwind 聚合,先使用 $project 进行分组,然后再使用 $unwind 拆分文档中的数组为一条新文档记录
*
*/
@Test
public void aggregateProjectUnwind() {
// 设置聚合条件,设置显示`name`、`age`、`title`字段,然后将结果中的多条文档按 title 字段进行拆分
AggregationOperation project = Aggregation.project("name", "age", "title");
AggregationOperation unwind = Aggregation.unwind("title");
// 将操作加入到聚合对象中
Aggregation aggregation = Aggregation.newAggregation(project, unwind);
// 执行聚合查询
AggregationResults<Map> results = mongoTemplate.aggregate(aggregation, COLLECTION_NAME, Map.class);
for (Map result : results.getMappedResults()) {
log.info("{}", result);
}
}
/**
* 创建升序索引
*
*/
@Test
public void createAscendingIndex() {
// 设置字段名称
String field = "name";
// 创建索引
String index = mongoTemplate.getCollection(COLLECTION_NAME).createIndex(Indexes.ascending(field));
}
/**
* 创建降序索引
*
*/
@Test
public void createDescendingIndex() {
// 设置字段名称
String field = "name";
// 创建索引
String index = mongoTemplate.getCollection(COLLECTION_NAME).createIndex(Indexes.descending(field));
}
/**
* 创建升序复合索引
*
*/
@Test
public void createCompositeIndex() {
// 设置字段名称
String field1 = "name";
String field2 = "age";
// 创建索引
String index = mongoTemplate.getCollection(COLLECTION_NAME).createIndex(Indexes.ascending(field1, field2));
}
/**
* 创建文字索引
*
*/
@Test
public void createTextIndex() {
// 设置字段名称
String field = "name";
// 创建索引
String index = mongoTemplate.getCollection(COLLECTION_NAME).createIndex(Indexes.text(field));
}
/**
* 创建哈希索引
*
*/
@Test
public void createHashIndex() {
// 设置字段名称
String field = "name";
// 创建索引
String index = mongoTemplate.getCollection(COLLECTION_NAME).createIndex(Indexes.hashed(field));
}
/**
* 创建升序唯一索引
*
*/
@Test
public void createUniqueIndex() {
// 设置字段名称
String indexName = "name";
// 配置索引选项
IndexOptions options = new IndexOptions();
// 设置为唯一索引
options.unique(true);
// 创建索引
String index = mongoTemplate.getCollection(COLLECTION_NAME).createIndex(Indexes.ascending(indexName), options);
}
/**
* 创建局部索引
*
*/
@Test
public void createPartialIndex() {
// 设置字段名称
String field = "name";
// 配置索引选项
IndexOptions options = new IndexOptions();
// 设置过滤条件
options.partialFilterExpression(Filters.exists("name", true));
// 创建索引
String index = mongoTemplate.getCollection(COLLECTION_NAME).createIndex(Indexes.ascending(field), options);
}
/**
* 获取当前【集合】对应的【所有索引】的【名称列表】
*
*/
@Test
public void getIndexAll() {
// 获取集合中所有列表
ListIndexesIterable<org.bson.Document> indexList = mongoTemplate.getCollection(COLLECTION_NAME).listIndexes();
// 创建字符串集合
List<Document> list = new ArrayList<>();
// 获取集合中全部索引信息
for (Document document : indexList) {
log.info("索引列表:{}",document);
list.add(document);
}
}
/**
* 根据索引名称移除索引
*/
@Test
public void removeIndex() {
// 设置索引名称
String indexName = "name_1";
// 删除集合中某个索引
mongoTemplate.getCollection(COLLECTION_NAME).dropIndex(indexName);
}
/**
* 移除全部索引
*/
@Test
public void removeIndexAll() {
// 删除集合中全部索引
mongoTemplate.getCollection(COLLECTION_NAME).dropIndexes();
}
}
MongoTemplate使用
最新推荐文章于 2024-07-23 16:09:16 发布