import lombok.extern.slf4j.Slf4j;
import mydlq.club.example.entity.Status;
import mydlq.club.example.entity.User;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
@Slf4j
@Service
public class InsertService {
private static final String COLLECTION_NAME = "users";
@Resource
private MongoTemplate mongoTemplate;
* 插入【一条】文档数据,如果文档信息已经【存在就抛出异常】
* @return 插入的文档信息
public Object 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));
User newUser = mongoTemplate.insert(user, COLLECTION_NAME);
log.info("存储的用户信息为:{}", newUser);
return newUser;
* 插入【多条】文档数据,如果文档信息已经【存在就抛出异常】
* @return 插入的多个文档信息
public Object insertMany(){
User user1 = new User()
.setId("11")
.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);
for (User user : newUserList) {
log.info("存储的用户信息为:{}", user);
return newUserList;
(2)、文档存储
import lombok.extern.slf4j.Slf4j;
import mydlq.club.example.entity.Status;
import mydlq.club.example.entity.User;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Date;
@Slf4j
@Service
public class SaveService {
private static final String COLLECTION_NAME = "users";
@Resource
private MongoTemplate mongoTemplate;
* 存储【一条】用户信息,如果文档信息已经【存在就执行更新】
* @return 存储的文档信息
public Object 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));
User newUser = mongoTemplate.save(user, COLLECTION_NAME);
log.info("存储的用户信息为:{}", newUser);
return newUser;
(3)、文档查询
import lombok.extern.slf4j.Slf4j;
import mydlq.club.example.entity.User;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Arrays;
import java.util.List;
@Slf4j
@Service
public class QueryService {
* 设置集合名称
private static final String COLLECTION_NAME = "users";
@Resource
private MongoTemplate mongoTemplate;
* 查询集合中的【全部】文档数据
* @return 全部文档列表
public Object findAll() {
List<
User> documentList = mongoTemplate.findAll(User.class, COLLECTION_NAME);
for (User user : documentList) {
log.info("用户信息:{}", user);
return documentList;
* 根据【文档ID】查询集合中文档数据
* @return 文档信息
public Object findById() {
String id = "1";
User user = mongoTemplate.findById(id, User.class, COLLECTION_NAME);
log.info("用户信息:{}", user);
return user;
* 根据【条件】查询集合中【符合条件】的文档,只取【第一条】数据
* @return 符合条件的第一条文档
public Object 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);
return user;
* 根据【条件】查询集合中【符合条件】的文档,获取其【文档列表】
* @return 符合条件的文档列表
public Object findByCondition() {
String sex = "女";
Criteria criteria = Criteria.where("sex").is(sex);
Query query = new Query(criteria);
List<User> documentList = mongoTemplate.find(query, User.class, COLLECTION_NAME);
for (User user : documentList) {
log.info("用户信息:{}", user);
return documentList;
* 根据【条件】查询集合中【符合条件】的文档,获取其【文档列表】并【排序】
* @return 符合条件的文档列表
public Object findByConditionAndSort() {
String sex = "男";
String sort = "age";
Criteria criteria = Criteria.where("sex").is(sex);
Query query = new Query(criteria).with(Sort.by(sort));
List<User> documentList = mongoTemplate.find(query, User.class, COLLECTION_NAME);
for (User user : documentList) {
log.info("用户信息:{}", user);
return documentList;
* 根据【单个条件】查询集合中的文档数据,并【按指定字段进行排序】与【限制指定数目】
* @return 符合条件的文档列表
public Object 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);
return documentList;
* 根据【单个条件】查询集合中的文档数据,并【按指定字段进行排序】与【并跳过指定数目】
* @return 符合条件的文档列表
public Object 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);
return documentList;
* 查询【存在指定字段名称】的文档数据
* @return 符合条件的文档列表
public Object 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);
return documentList;
* 根据【AND】关联多个查询条件,查询集合中的文档数据
* @return 符合条件的文档列表
public Object findByAndCondition() {
String sex = "男";
Integer age = 22;
Criteria criteriaSex = Criteria.where("sex").is(sex);
Criteria criteriaAge = Criteria.where("age").is(age);
Criteria criteria = new Criteria().andOperator(criteriaSex, criteriaAge);
Query query = new Query(criteria);
List<User> documentList = mongoTemplate.find(query, User.class, COLLECTION_NAME);
for (User user : documentList) {
log.info("用户信息:{}", user);
return documentList;
* 根据【OR】关联多个查询条件,查询集合中的文档数据
* @return 符合条件的文档列表
public Object findByOrCondition() {
String sex = "男";
int age = 22;
Criteria criteriaSex = Criteria.where("sex").is(sex);
Criteria criteriaAge = Criteria.where("age").is(age);
Criteria criteria = new Criteria().orOperator(criteriaSex, criteriaAge);
Query query = new Query(criteria);
List<User> documentList = mongoTemplate.find(query, User.class, COLLECTION_NAME);
for (User user : documentList) {
log.info("用户信息:{}", user);
return documentList;
* 根据【IN】关联多个查询条件,查询集合中的文档数据
* @return 符合条件的文档列表
public Object findByInCondition() {
Integer[] ages = {20, 22, 25};
List<Integer> ageList = Arrays.asList(ages);
Criteria criteria = Criteria.where("age").in(ageList);
Query query = new Query(criteria);
List<User> documentList = mongoTemplate.find(query, User.class, COLLECTION_NAME);
for (User user : documentList) {
log.info("用户信息:{}", user);
return documentList;
* 根据【逻辑运算符】查询集合中的文档数据
* @return 符合条件的文档列表
public Object findByOperator() {
int min = 25;
int max = 35;
Criteria criteria = Criteria.where("age").gt(min).lte(max);
Query query = new Query(criteria);
List<User> documentList = mongoTemplate.find(query, User.class, COLLECTION_NAME);
for (User user : documentList) {
log.info("用户信息:{}", user);
return documentList;
* 根据【正则表达式】查询集合中的文档数据
* @return 符合条件的文档列表
public Object findByRegex() {
String regex = "^zh*";
Criteria criteria = Criteria.where("name").regex(regex);
Query query = new Query(criteria);
List<User> documentList = mongoTemplate.find(query, User.class, COLLECTION_NAME);
for (User user : documentList) {
log.info("用户信息:{}", user);
return documentList;
* 统计集合中符合【查询条件】的文档【数量】
* @return 符合条件的文档列表
public Object countNumber() {
int age = 22;
Criteria criteria = Criteria.where(
"age").is(age);
Query query = new Query(criteria);
long count = mongoTemplate.count(query, User.class, COLLECTION_NAME);
log.info("符合条件的文档数量:{}", count);
return count;
(4)、文档更新
import com.mongodb.client.result.UpdateResult;
import lombok.extern.slf4j.Slf4j;
import mydlq.club.example.entity.User;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
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.stereotype.Service;
import javax.annotation.Resource;
@Slf4j
@Service
public class UpdateService {
* 设置集合名称
private static final String COLLECTION_NAME = "users";
@Resource
private MongoTemplate mongoTemplate;
* 更新集合中【匹配】查询到的第一条文档数据,如果没有找到就【创建并插入一个新文档】
* @return 执行更新的结果
public Object 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);
return resultInfo;
* 更新集合中【匹配】查询到的【文档数据集合】中的【第一条数据】
* @return 执行更新的结果
public Object 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 resultInfo;
* 更新【匹配查询】到的【文档数据集合】中的【所有数据】
* @return 执行更新的结果
public Object 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 resultInfo;
(5)、文档删除
import com.mongodb.client.result.DeleteResult;
import lombok.extern.slf4j.Slf4j;
import mydlq.club.example.entity.User;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.
Query;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
@Slf4j
@Service
public class RemoveService {
* 设置集合名称
private static final String COLLECTION_NAME = "users";
@Resource
private MongoTemplate mongoTemplate;
* 删除集合中【符合条件】的【一个]或[多个】文档
* @return 删除用户信息的结果
public Object 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 resultInfo;
* 删除【符合条件】的【单个文档】,并返回删除的文档。
* @return 删除的用户信息
public Object 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);
return result;
* 删除【符合条件】的【全部文档】,并返回删除的文档。
* @return 删除的全部用户信息
public Object 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);
return resultList;
(1)、聚合表达式
import lombok.extern.slf4j.Slf4j;
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.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Map;
* 聚合表达式 $group
* @author mydlq
@Slf4j
@Service
public class AggregateGroupService {
* 设置集合名称
private static final String COLLECTION_NAME = "users";
@Resource
private MongoTemplate mongoTemplate;
* 使用管道操作符 $group 结合 $count 方法进行聚合统计
* @return 聚合结果
public Object aggregationGroupCount() {
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);
return results.getMappedResults();
* 使用管道操作符 $group 结合表达式操作符 $max 进行聚合统计
* @return 聚合结果
public Object aggregationGroupMax() {
AggregationOperation group = Aggregation.group("sex").max("salary").as("salaryMax");
Aggregation aggregation = Aggregation.newAggregation(group);
AggregationResults<Map> results = mongoTemplate.aggregate(aggregation, COLLECTION_NAME, Map.class);
for (Map result : results.getMappedResults()) {
log.info("{}", result);
return results.getMappedResults();
* 使用管道操作符 $group 结合表达式操作符 $min 进行聚合统计
* @return 聚合结果
public
Object aggregationGroupMin() {
AggregationOperation group = Aggregation.group("sex").min("salary").as("salaryMin");
Aggregation aggregation = Aggregation.newAggregation(group);
AggregationResults<Map> results = mongoTemplate.aggregate(aggregation, COLLECTION_NAME, Map.class);
for (Map result : results.getMappedResults()) {
log.info("{}", result);
return results.getMappedResults();
* 使用管道操作符 $group 结合表达式操作符 $sum 进行聚合统计
* @return 聚合结果
public Object aggregationGroupSum() {
AggregationOperation group = Aggregation.group("sex").sum("salary").as("salarySum");
Aggregation aggregation = Aggregation.newAggregation(group);
AggregationResults<Map> results = mongoTemplate.aggregate(aggregation, COLLECTION_NAME, Map.class);
for (Map result : results.getMappedResults()) {
log.info("{}", result);
return results.getMappedResults();
* 使用管道操作符 $group 结合表达式操作符 $avg 进行聚合统计
* @return 聚合结果
public Object aggregationGroupAvg() {
AggregationOperation group = Aggregation.group("sex").avg("salary").as("salaryAvg");
Aggregation aggregation = Aggregation.newAggregation(group);
AggregationResults<Map> results = mongoTemplate.aggregate(aggregation, COLLECTION_NAME, Map.class);
for (Map result : results.getMappedResults()) {
log.info("{}", result);
return results.getMappedResults();
* 使用管道操作符 $group 结合表达式操作符 $first 获取每个组的包含某字段的文档的第一条数据
* @return 聚合结果
public Object aggregationGroupFirst() {
AggregationOperation sort = Aggregation.sort(Sort.by("salary").ascending());
AggregationOperation group = Aggregation.group("sex").first("salary").as("salaryFirst");
Aggregation aggregation = Aggregation.newAggregation(sort, group);
AggregationResults<Map> results = mongoTemplate.aggregate(aggregation, COLLECTION_NAME, Map.class);
for (Map result : results.getMappedResults()) {
log.info("{}", result);
return results.getMappedResults();
* 使用管道操作符 $group 结合表达式操作符 $last 获取每个组的包含某字段的文档的最后一条数据
* @return 聚合结果
public Object aggregationGroupLast() {
AggregationOperation sort = Aggregation.sort(Sort.by("salary").ascending());
AggregationOperation group = Aggregation.group("sex").last("salary").as("salaryLast");
Aggregation aggregation = Aggregation.newAggregation(sort, group);
AggregationResults<Map> results = mongoTemplate.aggregate(aggregation, COLLECTION_NAME, Map.class);
for (Map result : results.getMappedResults()) {
log.info("{}", result);
return results.getMappedResults();
* 使用管道操作符 $group 结合表达式操作符 $push 获取某字段列表
* @return 聚合结果
public Object aggregationGroupPush() {
AggregationOperation push = Aggregation.group("sex").push("salary").as("salaryFirst");
Aggregation aggregation = Aggregation.newAggregation(push);
AggregationResults<Map> results = mongoTemplate.aggregate(aggregation, COLLECTION_NAME, Map.class
);
for (Map result : results.getMappedResults()) {
log.info("{}", result);
return results.getMappedResults();
(2)、聚合管道操作符
import lombok.extern.slf4j.Slf4j;
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.springframework.data.mongodb.core.query.Criteria;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Map;
@Slf4j
@Service
public class AggregatePipelineService {
* 设置集合名称
private static final String COLLECTION_NAME = "users";
@Resource
private MongoTemplate mongoTemplate;
* 使用 $group 和 $match 聚合,先使用 $match 过滤文档,然后再使用 $group 进行分组
* @return 聚合结果
public Object aggregateGroupMatch() {
AggregationOperation match = Aggregation.match(Criteria.where("age").lt(25));
AggregationOperation group = Aggregation.group("sex").max("salary").as("sexSalary");
Aggregation aggregation = Aggregation.newAggregation(match, group);
AggregationResults<Map> results = mongoTemplate.aggregate(aggregation, COLLECTION_NAME, Map.class);
for (Map result : results.getMappedResults()) {
log.info("{}", result);
return results.getMappedResults();
* 使用 $group 和 $sort 聚合,先使用 $group 进行分组,然后再使用 $sort 排序
* @return 聚合结果
public Object 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);
return results.getMappedResults();
* 使用 $group 和 $limit 聚合,先使用 $group 进行分组,然后再使用 $limit 限制一定数目文档
* @return 聚合结果
public Object 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);
return results.getMappedResults();
* 使用 $group 和 $skip 聚合,先使用 $group 进行分组,然后再使用 $skip 跳过一定数目文档
* @return 聚合结果
public Object aggregateGroupSkip() {
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);
return results.getMappedResults();
* 使用 $group 和 $project 聚合,先使用 $group 进行分组,然后再使用 $project 限制显示的字段
* @return 聚合结果
public Object aggregateGroupProject() {
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);
return results.getMappedResults();
* 使用 $group 和 $unwind 聚合,先使用 $project 进行分组,然后再使用 $unwind 拆分文档中的数组为一条新文档记录
* @return 聚合结果
public Object aggregateProjectUnwind() {
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);
return results.getMappedResults();
聚合管道操作符:
$project: 可以从文档中选择想要的字段,和不想要的字段(指定的字段可以是来自输入文档或新计算字段的现有字段 ,也可以通过管道表达式进行一些复杂的操作,例如数学操作,日期操作,字符串操作,逻辑操作。$match: 用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。$limit: 用来限制MongoDB聚合管道返回的文档数。$skip: 在聚合管道中跳过指定数量的文档,并返回余下的文档。$unwind: 将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。$group: 将集合中的文档分组,可用于统计结果。$sort: 将输入文档排序后输出。
(1)、创建索引
import com.mongodb.client.model.Filters;
import com.mongodb.client.model.IndexOptions;
import com.mongodb.client.model.Indexes;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Slf4j
@Service
public class CreateIndexService {
private static final String COLLECTION_NAME = "users";
@Resource
private MongoTemplate mongoTemplate;
* 创建升序索引
* @return 索引信息
public Object createAscendingIndex() {
String field = "name";
return mongoTemplate.getCollection(COLLECTION_NAME).createIndex(Indexes.ascending(field));
* 创建降序索引
* @return 索引信息
public Object createDescendingIndex() {
String field = "name";
return mongoTemplate.getCollection(COLLECTION_NAME).createIndex(Indexes.descending(field));
* 创建升序复合索引
* @return 索引信息
public Object createCompositeIndex() {
String field1 = "name";
String field2 = "age";
return mongoTemplate.getCollection(COLLECTION_NAME).createIndex(Indexes.ascending(field1, field2));
* 创建文字索引
* @return 索引信息
public Object createTextIndex() {
String field = "name";
return mongoTemplate.getCollection(COLLECTION_NAME).createIndex(Indexes.text(field))
;
* 创建哈希索引
* @return 索引信息
public Object createHashIndex() {
String field = "name";
return mongoTemplate.getCollection(COLLECTION_NAME).createIndex(Indexes.hashed(field));
* 创建升序唯一索引
* @return 索引信息
public Object createUniqueIndex() {
String indexName = "name";
IndexOptions options = new IndexOptions();
options.unique(true);
return mongoTemplate.getCollection(COLLECTION_NAME).createIndex(Indexes.ascending(indexName), options);
* 创建局部索引
* @return 索引信息
public Object createPartialIndex() {
String field = "name";
IndexOptions options = new IndexOptions();
options.partialFilterExpression(Filters.exists("name", true));
return mongoTemplate.getCollection(COLLECTION_NAME).createIndex(Indexes.ascending(field), options);
(2)、查询索引
import com.mongodb.client.ListIndexesIterable;
import lombok.extern.slf4j.Slf4j;
import org.bson.Document;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
* 查询索引操作
* @author mydlq
@Slf4j
@Service
public class QueryIndexService {
private static final String COLLECTION_NAME = "users";
@Resource
private MongoTemplate mongoTemplate;
* 获取当前【集合】对应的【所有索引】的【名称列表】
* @return 当前【集合】所有【索引名称列表】
public Object getIndexAll() {
ListIndexesIterable<Document> indexList = mongoTemplate.getCollection(COLLECTION_NAME).listIndexes();
List<Document> list = new ArrayList<>();
for (Document document : indexList) {
log.info("索引列表:{}",document);
list.add(document);
return list;
(3)、删除索引
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Slf4j
@Service
public class RemoveIndexService {
@Resource
private MongoTemplate mongoTemplate;
private static final String COLLECTION_NAME = "users";
* 根据索引名称移除索引
public void removeIndex() {
String indexName = "name_1";
mongoTemplate.getCollection(COLLECTION_NAME).dropIndex(indexName);
* 移除全部索引
public void removeIndexAll() {
mongoTemplate.getCollection(COLLECTION_NAME).dropIndexes();
import org.bson.Document;
import org.bson.conversions.Bson;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
public class RunCommandService {
@Resource
private MongoTemplate mongoTemplate;
* 执行 mongoDB 自定义命令,详情可以查看:https://docs.mongodb.com/manual/reference/command/
* @return 执行命令返回结果的 Json 结果
* @description 执行自定义 mongoDB 命令
public Object runCommand() {
String jsonCommand = "{\"buildInfo\":1}";
Bson bson = Document.parse(jsonCommand);
return mongoTemplate.getDb().runCommand(bson);
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.MongoDatabaseFactory;
import org.springframework.data.mongodb.MongoTransactionManager;
* 配置事务管理器
* @author mydlq
@Configuration
public class TransactionConfig {
@Bean
MongoTransactionManager transactionManager(MongoDatabaseFactory dbFactory) {
return new MongoTransactionManager(dbFactory);
import mydlq.club.example.entity.Status;
import mydlq.club.example.entity.User;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.Date;
@Service
public class TransactionExample {
private static final String COLLECTION_NAME = "users";
@Resource
private MongoTemplate mongoTemplate;
@Transactional(rollbackFor = Exception.class)
public Object transactionTest(){
User user1 = new User()
.setId("11")
.setAge(22)
.setSex("男")
.setRemake("无")
.setSalary(1500)
.setName("shiyi")
.setBirthday(new Date())
.setStatus(new Status().setHeight(180).setWeight(150));
User newUser1 = mongoTemplate.insert(user1, COLLECTION_NAME);
int error = 1/0;
return newUser1;