Skip to content

Commit

Permalink
[Feature] 增加 mongo repository 的 CRUD、聚合、分页等基础实现 (#280)
Browse files Browse the repository at this point in the history
* feat: 增加 mongo repository 的 CRUD、聚合、分页等基础实现
  • Loading branch information
parzulpan authored Jun 13, 2024
1 parent 3651b51 commit caad935
Show file tree
Hide file tree
Showing 2 changed files with 142 additions and 5 deletions.
Original file line number Diff line number Diff line change
@@ -1,19 +1,93 @@
package com.xiaojusurvey.engine.repository;

import com.xiaojusurvey.engine.common.entity.BaseEntity;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.AggregationResults;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;

import java.util.Collection;
import java.util.List;

public interface MongoRepository {

/**
* 保存一个对象,如果对象已存在则更新它
*/
<T extends BaseEntity> T save(T saveObject);

<T extends BaseEntity> T findById(Object id, Class<T> entityClass);
/**
* 保存一个对象到指定集合,如果对象已存在则更新它
*/
<T extends BaseEntity> T save(T saveObject, String collectionName);

<T extends BaseEntity> List<T> findAll(Class<T> entityClass);
/**
* 批量保存一组对象
*/
<T extends BaseEntity> Collection<T> batchSave(Collection<? extends T> batchToSave, Class<T> entityClass);

/**
* 根据查询条件查找单个对象
*/
<T extends BaseEntity> T findOne(Query query, Class<T> entityClass);

/**
* 根据 ID 查找对象
*/
<T extends BaseEntity> T findById(Object id, Class<T> entityClass);

/**
* 查找某个类型的所有对象
*/
<T extends BaseEntity> List<T> findAll(Class<T> entityClass);

/**
* 查找并修改符合条件的对象
*/
<T extends BaseEntity> T findAndModify(Query query, Update update, Class<T> entityClass);

/**
* 查找并删除符合条件的对象
*/
<T extends BaseEntity> T findAndRemove(Query query, Class<T> entityClass);

/**
* 更新第一个符合条件的对象
*/
<T extends BaseEntity> void updateFirst(Query query, Update update, Class<T> entityClass);

/**
* 更新所有符合条件的对象
*/
<T extends BaseEntity> void updateMulti(Query query, Update update, Class<T> entityClass);

/**
* 删除符合条件的对象
*/
<T extends BaseEntity> void delete(Query query, Class<T> entityClass);

/**
* 根据 ID 删除对象
*/
<T extends BaseEntity> void deleteById(Object id, Class<T> entityClass);

/**
* 统计符合条件的对象数量
*/
<T extends BaseEntity> Long count(Query query, Class<T> entityClass);

/**
* 判断是否存在符合条件的对象
*/
<T extends BaseEntity> boolean exists(Query query, Class<T> entityClass);

/**
* 执行聚合查询,例如分组、过滤、排序、投影等
*/
<T> AggregationResults<T> aggregate(Aggregation aggregation, Class<?> inputType, Class<T> outputType);

/**
* 多条件分页查询
*/
<T extends BaseEntity> List<T> page(Query query, int pageIndex, int pageSize, Class<T> entityClass);
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,17 @@
import com.xiaojusurvey.engine.common.entity.BaseEntity;
import com.xiaojusurvey.engine.common.exception.DaoException;
import com.xiaojusurvey.engine.repository.MongoRepository;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.AggregationResults;
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.Repository;

import javax.annotation.Resource;
import java.util.Collection;
import java.util.List;
import java.util.Objects;

Expand All @@ -20,12 +25,27 @@ public class MongoRepositoryImpl implements MongoRepository {
@Resource
private MongoTemplate mongoTemplate;


@Override
public <T extends BaseEntity> T save(T saveObject) {
return mongoTemplate.save(saveObject);
}

@Override
public <T extends BaseEntity> T save(T saveObject, String collectionName) {
return mongoTemplate.save(saveObject, collectionName);
}

@Override
public <T extends BaseEntity> Collection<T> batchSave(Collection<? extends T> batchToSave,
Class<T> entityClass) {
return mongoTemplate.insert(batchToSave, entityClass);
}

@Override
public <T extends BaseEntity> T findOne(Query query, Class<T> entityClass) {
return mongoTemplate.findOne(query, entityClass);
}

@Override
public <T extends BaseEntity> T findById(Object id, Class<T> entityClass) {
if (Objects.isNull(id)) {
Expand All @@ -39,15 +59,58 @@ public <T extends BaseEntity> List<T> findAll(Class<T> entityClass) {
return mongoTemplate.findAll(entityClass);
}

@Override
public <T extends BaseEntity> T findAndModify(Query query, Update update, Class<T> entityClass) {
return mongoTemplate.findAndModify(query, update, entityClass);
}

@Override
public <T extends BaseEntity> T findOne(Query query, Class<T> entityClass) {
return mongoTemplate.findOne(query, entityClass);
public <T extends BaseEntity> T findAndRemove(Query query, Class<T> entityClass) {
return mongoTemplate.findAndRemove(query, entityClass);
}

@Override
public <T extends BaseEntity> void updateFirst(Query query, Update update, Class<T> entityClass) {
mongoTemplate.updateFirst(query, update, entityClass);
}

@Override
public <T extends BaseEntity> void updateMulti(Query query, Update update, Class<T> entityClass) {
mongoTemplate.updateMulti(query, update, entityClass);
}

@Override
public <T extends BaseEntity> void delete(Query query, Class<T> entityClass) {
mongoTemplate.remove(query, entityClass);
}

@Override
public <T extends BaseEntity> void deleteById(Object id, Class<T> entityClass) {
Query query = new Query(Criteria.where("_id").is(id));
mongoTemplate.remove(query, entityClass);
}

@Override
public <T extends BaseEntity> Long count(Query query, Class<T> entityClass) {
return mongoTemplate.count(query, entityClass);
}

@Override
public <T extends BaseEntity> boolean exists(Query query, Class<T> entityClass) {
return mongoTemplate.exists(query, entityClass);
}

@Override
public <T> AggregationResults<T> aggregate(Aggregation aggregation, Class<?> inputType, Class<T> outputType) {
return mongoTemplate.aggregate(aggregation, inputType, outputType);
}

@Override
public <T extends BaseEntity> List<T> page(Query query, int pageIndex, int pageSize, Class<T> entityClass) {
PageRequest pageRequest = PageRequest.of(pageIndex, pageSize);
query.with(pageRequest);

return mongoTemplate.find(query, entityClass);
}

}

0 comments on commit caad935

Please sign in to comment.