MongDb中 同字段不同数据表 处理方式
程序员文章站
2022-06-06 23:01:48
...
MongDb中同字段不同数据库 处理方式
不需要写很多增删改查,仅仅可以通过集合去区分不同的表,进行crud操作。
如 我这儿需要四个表,相同字段。 最笨的方法是写一套,写四个类,再写四个Dao方法,然后复制粘贴。
比较优雅的方式是,可以根据mongo中提供的接口,写一套crud接口。
四个表
字段
public String id;
@NotEmpty(message = "cjrId 不能为空")
public String cjrId;
@NotEmpty(message = "syrId 不能为空")
public String syrId;
@NotEmpty(message = "url 不能为空")
public String url;
@NotEmpty(message = "method 不能为空")
public String method;
public Date cjsj;
判断不同表的枚举类
/**
* user config
*/
public enum CirConfigEnum {
EMAIL,
GX,
INVOICE,
TEMPLATE;
//db 前缀
final static String profix = "Cir_";
/**
* 选取集合
*
* @param concellection
* @return
*/
public static String getCirConfigEnum(String concellection) {
String str = "";
if (concellection.equals(EMAIL.name())) {
str = profix + EMAIL.name();
} else if (concellection.equals(GX.name())) {
str = profix + GX.name();
} else if (concellection.equals(INVOICE.name())) {
str = profix + INVOICE.name();
} else if (concellection.equals(TEMPLATE.name())) {
str = profix + TEMPLATE.name();
}
return str;
}
}
这样处理的一句是MongoTemplate 接口提供了针对集合查询的接口
如:
这里仅列举了查询的接口,保存和删除都有。
crud
@Service
@Slf4j
public class CircuitConfigDao {
@Autowired
private MongoTemplate mongoTemplate;
public void save(CircuitConfig CircuitConfig, String collectionName) {
mongoTemplate.save(CircuitConfig, collectionName);
}
public CircuitConfig getFirstById(String id, String collectionName) {
Criteria criteria = new Criteria();
criteria.and("_id").is(id);
Query query = new Query(criteria);
return mongoTemplate.findById(query, CircuitConfig.class, collectionName);
}
public void deleteAllById(String id, String collectionName) {
mongoTemplate.remove(id, collectionName);
}
/**
* 分页查询
*
* @param user 用户
* @param page 每页
* @param pageSize 每页数量
* @param collectionName 查询集合名称
* @return 配置类
*/
public Page<CircuitConfig> getListWithCriteria(CircuitConfig user, int page, int pageSize, String collectionName) {
log.info("查询条件为 {} 页码 {} , 每页数量 {} ", user, page, pageSize);
//mongodb 页码从0开始
if (page == 1) {
page = 0;
}
Sort sort = new Sort(Sort.Direction.DESC, "_id");
Pageable pageable = new PageRequest(page, pageSize, sort);
Query query = null;
if (user != null) {
query = queryVoide(user);
} else {
query = new Query(new Criteria());
}
//计算总数
long total = mongoTemplate.count(query, CircuitConfig.class, collectionName);
//查询结果集
List<CircuitConfig> userBeansList = mongoTemplate.find(query.with(pageable), CircuitConfig.class, collectionName);
Page<CircuitConfig> userBeanPage = new PageImpl(userBeansList, pageable, total);
log.info("查询结果为 {} ", userBeanPage);
return userBeanPage;
}
/**
* 查询实体
*
* @param CircuitConfig
* @return
*/
public static Query queryVoide(CircuitConfig CircuitConfig) {
Query query = new Query();
//id
if (!StringUtils.isEmpty(CircuitConfig.getId())) {
query.addCriteria(Criteria.where("id").is(CircuitConfig.getId()));
}
//cjrId
if (!StringUtils.isEmpty(CircuitConfig.getCjrId())) {
query.addCriteria(Criteria.where("cjrId").is(CircuitConfig.getCjrId()));
}
//syrId
if (!StringUtils.isEmpty(CircuitConfig.getSyrId())) {
query.addCriteria(Criteria.where("syrId").is(CircuitConfig.getSyrId()));
}
//url
if (!StringUtils.isEmpty(CircuitConfig.getUrl())) {
query.addCriteria(Criteria.where("url").is(CircuitConfig.getUrl()));
}
//method
if (!StringUtils.isEmpty(CircuitConfig.getMethod())) {
query.addCriteria(Criteria.where("method").is(CircuitConfig.getMethod()));
}
return query;
}
}
postman测试
这里只测试一个
db查询
可以看到
注意
:
如果集合名称不同,数据库中不存在的话,也会去链接数据库,恶意请求大的情况下会,占用数据连接资源,轻者数据库挂了。
解决:可以写个拦截器,根据集合名称进行拦截,返回请求。