欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MongDb中 同字段不同数据表 处理方式

程序员文章站 2022-06-06 23:01:48
...

MongDb中同字段不同数据库 处理方式

不需要写很多增删改查,仅仅可以通过集合去区分不同的表,进行crud操作。

如 我这儿需要四个表,相同字段。 最笨的方法是写一套,写四个类,再写四个Dao方法,然后复制粘贴。

比较优雅的方式是,可以根据mongo中提供的接口,写一套crud接口。

四个表
MongDb中 同字段不同数据表 处理方式

字段

    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 接口提供了针对集合查询的接口
如:
这里仅列举了查询的接口,保存和删除都有。
MongDb中 同字段不同数据表 处理方式

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测试

这里只测试一个
MongDb中 同字段不同数据表 处理方式

db查询

可以看到
MongDb中 同字段不同数据表 处理方式

注意

如果集合名称不同,数据库中不存在的话,也会去链接数据库,恶意请求大的情况下会,占用数据连接资源,轻者数据库挂了。

解决:可以写个拦截器,根据集合名称进行拦截,返回请求。

相关标签: mongo