All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.taotao.cloud.data.mongodb.helper.utils.MongoHelper Maven / Gradle / Ivy

There is a newer version: 2024.09
Show newest version
/*
 * Copyright (c) 2020-2030, Shuigedeng ([email protected] & https://blog.taotaocloud.top/).
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.taotao.cloud.data.mongodb.helper.utils;

import com.taotao.cloud.common.utils.log.LogUtils;
import com.taotao.cloud.data.mongodb.helper.bean.CreateTime;
import com.taotao.cloud.data.mongodb.helper.bean.InitValue;
import com.taotao.cloud.data.mongodb.helper.bean.Page;
import com.taotao.cloud.data.mongodb.helper.bean.SlowQuery;
import com.taotao.cloud.data.mongodb.helper.bean.SortBuilder;
import com.taotao.cloud.data.mongodb.helper.bean.UpdateBuilder;
import com.taotao.cloud.data.mongodb.helper.bean.UpdateTime;
import com.taotao.cloud.data.mongodb.helper.config.Constant;
import com.taotao.cloud.data.mongodb.helper.reflection.ReflectionUtil;
import com.taotao.cloud.data.mongodb.helper.reflection.SerializableFunction;
import com.taotao.cloud.data.mongodb.properties.MongodbProperties;
import jakarta.annotation.PostConstruct;
import java.lang.reflect.Field;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.bson.Document;
import org.dromara.hutool.core.date.DateUtil;
import org.dromara.hutool.core.reflect.FieldUtil;
import org.dromara.hutool.core.text.StrUtil;
import org.dromara.hutool.json.JSONObject;
import org.dromara.hutool.json.JSONUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort.Direction;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.convert.MongoConverter;
import org.springframework.data.mongodb.core.convert.QueryMapper;
import org.springframework.data.mongodb.core.convert.UpdateMapper;
import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity;
import org.springframework.data.mongodb.core.query.Query;

/**
 * mongodb操作器
 *
 * @author shuigedeng
 * @version 2022.05
 * @since 2022-05-27 21:55:12
 */
public class MongoHelper {

    @Autowired
    protected MongoConverter mongoConverter;

    @Autowired
    private MongodbProperties mongodbProperties;

    protected QueryMapper queryMapper;
    protected UpdateMapper updateMapper;

    @Autowired
    protected MongoTemplate mongoTemplate;

    /**
     * 得到mongo模板
     *
     * @return {@link MongoTemplate }
     * @since 2022-05-27 21:55:12
     */
    public MongoTemplate getMongoTemplate() {
        return mongoTemplate;
    }

    /**
     * 初始化
     *
     * @since 2022-05-27 21:55:12
     */
    @PostConstruct
    public void init() {
        queryMapper = new QueryMapper(mongoConverter);
        updateMapper = new UpdateMapper(mongoConverter);
    }

    /**
     * 插入慢查询
     *
     * @param log 日志
     * @param queryTime 查询时间
     * @since 2022-05-27 21:55:12
     */
    private void insertSlowQuery(String log, Long queryTime) {
        if (mongodbProperties.getSlowQuery()) {
            SlowQuery slowQuery = new SlowQuery();
            slowQuery.setQuery(log);
            slowQuery.setTime(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
            slowQuery.setQueryTime(queryTime);
            slowQuery.setSystem(SystemTool.getSystem());
            StackTraceElement[] stack = Thread.currentThread().getStackTrace();

            // 保存堆栈
            StringBuilder stackStr = new StringBuilder();
            for (StackTraceElement stackTraceElement : stack) {
                stackStr.append(stackTraceElement.getClassName())
                        .append(".")
                        .append(stackTraceElement.getMethodName())
                        .append(":")
                        .append(stackTraceElement.getLineNumber())
                        .append("\n");
            }
            slowQuery.setStack(stackStr.toString());

            mongoTemplate.insert(slowQuery);
        }
    }

    /**
     * 打印查询语句
     *
     * @param query
     */
    private void logQuery(Class clazz, Query query, Long startTime) {

        MongoPersistentEntity entity = mongoConverter.getMappingContext().getPersistentEntity(clazz);
        Document mappedQuery = queryMapper.getMappedObject(query.getQueryObject(), entity);
        Document mappedField = queryMapper.getMappedObject(query.getFieldsObject(), entity);
        Document mappedSort = queryMapper.getMappedObject(query.getSortObject(), entity);

        String log = "\ndb." + getCollectionName(clazz) + ".find(";

        log += FormatUtils.bson(mappedQuery.toJson()) + ")";

        if (!query.getFieldsObject().isEmpty()) {
            log += ".projection(";
            log += FormatUtils.bson(mappedField.toJson()) + ")";
        }

        if (query.isSorted()) {
            log += ".sort(";
            log += FormatUtils.bson(mappedSort.toJson()) + ")";
        }

        if (query.getLimit() != 0L) {
            log += ".limit(" + query.getLimit() + ")";
        }

        if (query.getSkip() != 0L) {
            log += ".skip(" + query.getSkip() + ")";
        }
        log += ";";

        // 记录慢查询
        Long queryTime = System.currentTimeMillis() - startTime;
        if (queryTime > mongodbProperties.getSlowTime()) {
            insertSlowQuery(log, queryTime);
        }
        if (mongodbProperties.getPrint()) {
            // 打印语句
            LogUtils.info(log + "\n执行时间:" + queryTime + "ms");
        }
    }

    private String getCollectionName(Class clazz) {
        org.springframework.data.mongodb.core.mapping.Document document =
                clazz.getAnnotation(org.springframework.data.mongodb.core.mapping.Document.class);
        if (document != null) {
            if (StrUtil.isNotEmpty(document.value())) {
                return document.value();
            }
            if (StrUtil.isNotEmpty(document.collection())) {
                return document.collection();
            }
        }

        return StrUtil.lowerFirst(clazz.getSimpleName());
    }

    /**
     * 打印查询语句
     *
     * @param query
     */
    private void logCount(Class clazz, Query query, Long startTime) {

        MongoPersistentEntity entity = mongoConverter.getMappingContext().getPersistentEntity(clazz);
        Document mappedQuery = queryMapper.getMappedObject(query.getQueryObject(), entity);

        String log = "\ndb." + StrUtil.lowerFirst(clazz.getSimpleName()) + ".find(";
        log += FormatUtils.bson(mappedQuery.toJson()) + ")";
        log += ".count();";

        // 记录慢查询
        Long queryTime = System.currentTimeMillis() - startTime;
        if (queryTime > mongodbProperties.getSlowTime()) {
            insertSlowQuery(log, queryTime);
        }
        if (mongodbProperties.getPrint()) {
            // 打印语句
            LogUtils.info(log + "\n执行时间:" + queryTime + "ms");
        }
    }

    /**
     * 打印查询语句
     *
     * @param query
     */
    private void logDelete(Class clazz, Query query, Long startTime) {

        MongoPersistentEntity entity = mongoConverter.getMappingContext().getPersistentEntity(clazz);
        Document mappedQuery = queryMapper.getMappedObject(query.getQueryObject(), entity);

        String log = "\ndb." + StrUtil.lowerFirst(clazz.getSimpleName()) + ".remove(";
        log += FormatUtils.bson(mappedQuery.toJson()) + ")";
        log += ";";

        // 记录慢查询
        Long queryTime = System.currentTimeMillis() - startTime;
        if (queryTime > mongodbProperties.getSlowTime()) {
            insertSlowQuery(log, queryTime);
        }
        if (mongodbProperties.getPrint()) {
            // 打印语句
            LogUtils.info(log + "\n执行时间:" + queryTime + "ms");
        }
    }

    /**
     * 打印查询语句
     *
     * @param query
     */
    private void logUpdate(Class clazz, Query query, UpdateBuilder updateBuilder, boolean multi, Long startTime) {

        MongoPersistentEntity entity = mongoConverter.getMappingContext().getPersistentEntity(clazz);
        Document mappedQuery = queryMapper.getMappedObject(query.getQueryObject(), entity);
        Document mappedUpdate =
                updateMapper.getMappedObject(updateBuilder.toUpdate().getUpdateObject(), entity);

        String log = "\ndb." + StrUtil.lowerFirst(clazz.getSimpleName()) + ".update(";
        log += FormatUtils.bson(mappedQuery.toJson()) + ",";
        log += FormatUtils.bson(mappedUpdate.toJson()) + ",";
        log += FormatUtils.bson("{multi:" + multi + "})");
        log += ";";

        // 记录慢查询
        Long queryTime = System.currentTimeMillis() - startTime;
        if (queryTime > mongodbProperties.getSlowTime()) {
            insertSlowQuery(log, queryTime);
        }
        if (mongodbProperties.getPrint()) {
            // 打印语句
            LogUtils.info(log + "\n执行时间:" + queryTime + "ms");
        }
    }

    /**
     * 打印查询语句
     *
     * @param object
     * @param startTime
     * @param isInsert
     */
    private void logSave(Object object, LocalDateTime startTime, Boolean isInsert) {
        JSONObject jsonObject = JSONUtil.parseObj(object);

        if (isInsert) {
            jsonObject.remove(Constant.ID);
        }

        String log = "\ndb." + StrUtil.lowerFirst(object.getClass().getSimpleName()) + ".save(";
        log += JSONUtil.toJsonPrettyStr(jsonObject);
        log += ");";

        // 记录慢查询
        Long queryTime = LocalDateTime.now().toInstant(ZoneOffset.ofHours(8)).toEpochMilli()
                - startTime.toInstant(ZoneOffset.ofHours(8)).toEpochMilli();
        if (queryTime > mongodbProperties.getSlowTime()) {
            insertSlowQuery(log, queryTime);
        }
        if (mongodbProperties.getPrint()) {
            // 打印语句
            LogUtils.info(log + "\n执行时间:" + queryTime + "ms");
        }
    }

    /**
     * 打印查询语句
     *
     * @param list
     * @param startTime
     */
    private void logSave(List list, LocalDateTime startTime) {
        List cloneList = new ArrayList<>();
        for (Object item : list) {
            JSONObject jsonObject = JSONUtil.parseObj(item);

            jsonObject.remove(Constant.ID);
            cloneList.add(jsonObject);
        }

        Object object = list.get(0);
        String log = "\ndb." + StrUtil.lowerFirst(object.getClass().getSimpleName()) + ".save(";
        log += JSONUtil.toJsonPrettyStr(cloneList);
        log += ");";

        // 记录慢查询
        Long queryTime = LocalDateTime.now().toInstant(ZoneOffset.ofHours(8)).toEpochMilli()
                - startTime.toInstant(ZoneOffset.ofHours(8)).toEpochMilli();
        ;
        if (queryTime > mongodbProperties.getSlowTime()) {
            insertSlowQuery(log, queryTime);
        }
        if (mongodbProperties.getPrint()) {
            // 打印语句
            LogUtils.info(log + "\n执行时间:" + queryTime + "ms");
        }
    }

    /**
     * 插入或更新
     *
     * @param object 对象
     */
    public String insertOrUpdate(Object object) {
        LocalDateTime time = LocalDateTime.now();
        String id = (String) FieldUtil.getFieldValue(object, Constant.ID);
        Object objectOrg = StrUtil.isNotEmpty(id) ? findById(id, object.getClass()) : null;

        if (objectOrg == null) {
            // 插入
            // 设置插入时间
            setCreateTime(object, time);
            // 设置更新时间
            setUpdateTime(object, time);

            // 设置默认值
            setDefaultVaule(object);
            // 去除id值
            FieldUtil.setFieldValue(object, Constant.ID, null);

            mongoTemplate.save(object);
            id = (String) FieldUtil.getFieldValue(object, Constant.ID);
            logSave(object, time, true);
        } else {
            // 更新
            Field[] fields = FieldUtil.getFields(object.getClass());
            // 拷贝属性
            for (Field field : fields) {
                if (!field.getName().equals(Constant.ID) && FieldUtil.getFieldValue(object, field) != null) {
                    FieldUtil.setFieldValue(objectOrg, field, FieldUtil.getFieldValue(object, field));
                }
            }

            // 设置更新时间
            setUpdateTime(objectOrg, time);
            mongoTemplate.save(objectOrg);
            logSave(objectOrg, time, false);
        }

        return id;
    }

    /**
     * 插入
     *
     * @param object 对象
     */
    public String insert(Object object) {
        FieldUtil.setFieldValue(object, Constant.ID, null);
        insertOrUpdate(object);
        return (String) FieldUtil.getFieldValue(object, Constant.ID);
    }

    /**
     * 批量插入
     *
     * @param 
     * @param list 对象
     */
    public  void insertAll(List list) {
        LocalDateTime time = LocalDateTime.now();

        for (Object object : list) {
            // 去除id以便插入
            FieldUtil.setFieldValue(object, Constant.ID, null);
            // 设置插入时间
            setCreateTime(object, time);
            // 设置更新时间
            setUpdateTime(object, time);
            // 设置默认值
            setDefaultVaule(object);
        }

        mongoTemplate.insertAll(list);
        logSave(list, time);
    }

    /**
     * 设置更新时间
     *
     * @param object 对象
     */
    private void setUpdateTime(Object object, LocalDateTime time) {
        Field[] fields = FieldUtil.getFields(object.getClass());
        for (Field field : fields) {
            // 获取注解
            if (field.isAnnotationPresent(UpdateTime.class) && field.getType().equals(Long.class)) {
                FieldUtil.setFieldValue(object, field, time);
            }
        }
    }

    /**
     * 设置创建时间
     *
     * @param object 对象
     * @param time 时间
     * @since 2022-05-27 21:55:04
     */
    private void setCreateTime(Object object, LocalDateTime time) {
        Field[] fields = FieldUtil.getFields(object.getClass());
        for (Field field : fields) {
            // 获取注解
            if (field.isAnnotationPresent(CreateTime.class) && field.getType().equals(Long.class)) {
                FieldUtil.setFieldValue(object, field, time);
            }
        }
    }

    /**
     * 根据id更新
     *
     * @param object 对象
     */
    public void updateById(Object object) {
        if (StrUtil.isEmpty((String) FieldUtil.getFieldValue(object, Constant.ID))) {
            return;
        }
        if (findById((String) FieldUtil.getFieldValue(object, Constant.ID), object.getClass()) == null) {
            return;
        }
        insertOrUpdate(object);
    }

    /**
     * 根据id更新全部字段
     *
     * @param object 对象
     */
    public void updateAllColumnById(Object object) {
        if (StrUtil.isEmpty((String) FieldUtil.getFieldValue(object, Constant.ID))) {
            return;
        }
        if (findById((String) FieldUtil.getFieldValue(object, Constant.ID), object.getClass()) == null) {
            return;
        }
        LocalDateTime time = LocalDateTime.now();
        setUpdateTime(object, time);
        mongoTemplate.save(object);
        logSave(object, time, false);
    }

    /**
     * 更新查到的第一项
     *
     * @param criteriaWrapper 查询
     * @param updateBuilder 更新
     * @param clazz 类
     */
    public void updateFirst(CriteriaWrapper criteriaWrapper, UpdateBuilder updateBuilder, Class clazz) {
        Long time = System.currentTimeMillis();
        Query query = new Query(criteriaWrapper.build());

        mongoTemplate.updateFirst(query, updateBuilder.toUpdate(), clazz);
        logUpdate(clazz, query, updateBuilder, false, time);
    }

    /**
     * 更新查到的全部项
     *
     * @param criteriaWrapper 查询
     * @param updateBuilder 更新
     * @param clazz 类
     */
    public void updateMulti(CriteriaWrapper criteriaWrapper, UpdateBuilder updateBuilder, Class clazz) {

        Long time = System.currentTimeMillis();
        Query query = new Query(criteriaWrapper.build());
        mongoTemplate.updateMulti(new Query(criteriaWrapper.build()), updateBuilder.toUpdate(), clazz);
        logUpdate(clazz, query, updateBuilder, true, time);
    }

    /**
     * 根据id删除
     *
     * @param id 对象
     * @param clazz 类
     */
    public void deleteById(String id, Class clazz) {
        if (StrUtil.isEmpty(id)) {
            return;
        }
        deleteByQuery(new CriteriaAndWrapper().eq(Constant::getId, id), clazz);
    }

    /**
     * 根据id删除
     *
     * @param ids 对象
     * @param clazz 类
     */
    public void deleteByIds(List ids, Class clazz) {

        if (ids == null || ids.size() == 0) {
            return;
        }

        deleteByQuery(new CriteriaAndWrapper().in(Constant::getId, ids), clazz);
    }

    /**
     * 根据条件删除
     *
     * @param criteriaWrapper 查询
     * @param clazz 类
     */
    public void deleteByQuery(CriteriaWrapper criteriaWrapper, Class clazz) {
        Long time = System.currentTimeMillis();
        Query query = new Query(criteriaWrapper.build());
        mongoTemplate.remove(query, clazz);
        logDelete(clazz, query, time);
    }

    /**
     * 设置默认值
     *
     * @param object 对象
     */
    private void setDefaultVaule(Object object) {
        Field[] fields = FieldUtil.getFields(object.getClass());
        for (Field field : fields) {
            // 获取注解
            if (field.isAnnotationPresent(InitValue.class)) {
                InitValue defaultValue = field.getAnnotation(InitValue.class);

                String value = defaultValue.value();

                if (FieldUtil.getFieldValue(object, field) == null) {
                    // 获取字段类型
                    Class type = field.getType();
                    if (type.equals(String.class)) {
                        FieldUtil.setFieldValue(object, field, value);
                    }
                    if (type.equals(Short.class)) {
                        FieldUtil.setFieldValue(object, field, Short.parseShort(value));
                    }
                    if (type.equals(Integer.class)) {
                        FieldUtil.setFieldValue(object, field, Integer.parseInt(value));
                    }
                    if (type.equals(Long.class)) {
                        FieldUtil.setFieldValue(object, field, Long.parseLong(value));
                    }
                    if (type.equals(Float.class)) {
                        FieldUtil.setFieldValue(object, field, Float.parseFloat(value));
                    }
                    if (type.equals(Double.class)) {
                        FieldUtil.setFieldValue(object, field, Double.parseDouble(value));
                    }
                    if (type.equals(Boolean.class)) {
                        FieldUtil.setFieldValue(object, field, Boolean.parseBoolean(value));
                    }
                }
            }
        }
    }

    /**
     * 累加某一个字段的数量,原子操作
     *
     * @param id id
     * @param property property
     * @param count count
     * @param clazz clazz
     * @since 2022-04-10 22:12:01
     */
    public  void addCountById(String id, SerializableFunction property, Number count, Class clazz) {
        UpdateBuilder updateBuilder = new UpdateBuilder().inc(property, count);
        updateFirst(new CriteriaAndWrapper().eq(Constant::getId, id), updateBuilder, clazz);
    }

    /**
     * 按查询条件获取Page
     *
     * @param criteriaWrapper 查询
     * @param page 分页
     * @param clazz 类
     * @return Page 分页
     */
    public  Page findPage(CriteriaWrapper criteriaWrapper, Page page, Class clazz) {
        SortBuilder sortBuilder = new SortBuilder(Constant::getId, Direction.DESC);
        return findPage(criteriaWrapper, sortBuilder, page, clazz);
    }

    /**
     * 按查询条件获取Page
     *
     * @param criteriaWrapper 查询
     * @param sortBuilder 排序
     * @param clazz 类
     * @return Page 分页
     */
    public  Page findPage(
            CriteriaWrapper criteriaWrapper, SortBuilder sortBuilder, Page page, Class clazz) {

        Page pageResp = new Page();
        pageResp.setCurr(page.getCurr());
        pageResp.setLimit(page.getLimit());

        // 查询出总条数
        if (page.getQueryCount()) {
            Long count = findCountByQuery(criteriaWrapper, clazz);
            pageResp.setCount(count);
        }

        // 查询List
        Query query = new Query(criteriaWrapper.build());
        query.with(sortBuilder.toSort());
        query.skip((long) (page.getCurr() - 1) * page.getLimit()); // 从那条记录开始
        query.limit(page.getLimit()); // 取多少条记录

        Long systemTime = System.currentTimeMillis();
        List list = mongoTemplate.find(query, clazz);
        logQuery(clazz, query, systemTime);

        pageResp.setList(list);

        return pageResp;
    }

    /**
     * 按查询条件获取Page
     *
     * @param sortBuilder 查询
     * @param page 排序
     * @param clazz 类
     * @return Page 分页
     */
    public  Page findPage(SortBuilder sortBuilder, Page page, Class clazz) {
        return findPage(new CriteriaAndWrapper(), sortBuilder, page, clazz);
    }

    /**
     * 获取Page
     *
     * @param page 分页
     * @param clazz 类
     * @return Page 分页
     */
    public  Page findPage(Page page, Class clazz) {
        return findPage(new CriteriaAndWrapper(), page, clazz);
    }

    /**
     * 根据id查找
     *
     * @param id id
     * @param clazz 类
     * @return T 对象
     */
    public  T findById(String id, Class clazz) {

        if (StrUtil.isEmpty(id)) {
            return null;
        }
        Long systemTime = System.currentTimeMillis();

        T t = (T) mongoTemplate.findById(id, clazz);

        CriteriaAndWrapper criteriaAndWrapper = new CriteriaAndWrapper().eq(Constant::getId, id);
        logQuery(clazz, new Query(criteriaAndWrapper.build()), systemTime);
        return t;
    }

    /**
     * 根据条件查找单个
     *
     * @param  类型
     * @param criteriaWrapper /
     * @param clazz 类
     * @return T 对象
     */
    public  T findOneByQuery(CriteriaWrapper criteriaWrapper, Class clazz) {
        SortBuilder sortBuilder = new SortBuilder(Constant::getId, Direction.DESC);
        return (T) findOneByQuery(criteriaWrapper, sortBuilder, clazz);
    }

    /**
     * 根据条件查找单个
     *
     * @param criteriaWrapper 查询
     * @param clazz 类
     * @return T 对象
     */
    public  T findOneByQuery(CriteriaWrapper criteriaWrapper, SortBuilder sortBuilder, Class clazz) {

        Query query = new Query(criteriaWrapper.build());
        query.limit(1);
        query.with(sortBuilder.toSort());

        Long systemTime = System.currentTimeMillis();
        T t = (T) mongoTemplate.findOne(query, clazz);
        logQuery(clazz, query, systemTime);

        return t;
    }

    /**
     * 根据条件查找单个
     *
     * @param sortBuilder 查询
     * @param clazz 类
     * @return T 对象
     */
    public  T findOneByQuery(SortBuilder sortBuilder, Class clazz) {
        return (T) findOneByQuery(new CriteriaAndWrapper(), sortBuilder, clazz);
    }

    /**
     * 根据条件查找List
     *
     * @param  类型
     * @param criteriaWrapper 查询
     * @param clazz 类
     * @return List 列表
     */
    public  List findListByQuery(CriteriaWrapper criteriaWrapper, Class clazz) {
        SortBuilder sortBuilder = new SortBuilder().add(Constant::getId, Direction.DESC);
        return findListByQuery(criteriaWrapper, sortBuilder, clazz);
    }

    /**
     * 根据条件查找List
     *
     * @param  类型
     * @param criteriaWrapper 查询
     * @param sortBuilder 排序
     * @param clazz 类
     * @return List 列表
     */
    public  List findListByQuery(CriteriaWrapper criteriaWrapper, SortBuilder sortBuilder, Class clazz) {
        Query query = new Query(criteriaWrapper.build());
        query.with(sortBuilder.toSort());

        Long systemTime = System.currentTimeMillis();
        List list = mongoTemplate.find(query, clazz);
        logQuery(clazz, query, systemTime);
        return list;
    }

    /**
     * 根据条件查找某个属性
     *
     * @param  类型
     * @param criteriaWrapper 查询
     * @param documentClass 类
     * @param property 属性
     * @param propertyClass 属性类
     * @return List 列表
     */
    public  List findPropertiesByQuery(
            CriteriaWrapper criteriaWrapper,
            Class documentClass,
            SerializableFunction property,
            Class propertyClass) {
        Query query = new Query(criteriaWrapper.build());
        query.fields().include(ReflectionUtil.getFieldName(property));

        Long systemTime = System.currentTimeMillis();
        List list = mongoTemplate.find(query, documentClass);
        logQuery(documentClass, query, systemTime);

        List propertyList = extractProperty(list, ReflectionUtil.getFieldName(property), propertyClass);
        return propertyList;
    }

    /**
     * 根据条件查找某个属性
     *
     * @param criteriaWrapper 查询
     * @param documentClass 类
     * @param property 属性
     * @return List 列表
     */
    public  List findPropertiesByQuery(
            CriteriaWrapper criteriaWrapper, Class documentClass, SerializableFunction property) {
        return findPropertiesByQuery(criteriaWrapper, documentClass, property, String.class);
    }

    /**
     * 根据id查找某个属性
     *
     * @param ids 查询
     * @param clazz 类
     * @param property 属性
     * @return List 列表
     */
    public  List findPropertiesByIds(
            List ids, Class clazz, SerializableFunction property) {
        CriteriaAndWrapper criteriaAndWrapper = new CriteriaAndWrapper().in(Constant::getId, ids);
        return findPropertiesByQuery(criteriaAndWrapper, clazz, property);
    }

    /**
     * 根据条件查找id
     *
     * @param criteriaWrapper 查询
     * @param clazz 类
     * @return List 列表
     */
    public List findIdsByQuery(CriteriaWrapper criteriaWrapper, Class clazz) {
        return findPropertiesByQuery(criteriaWrapper, clazz, Constant::getId);
    }

    /**
     * 根据id集合查找
     *
     * @param ids id集合
     * @param clazz 类
     * @return List 列表
     */
    public  List findListByIds(Collection ids, Class clazz) {
        CriteriaAndWrapper criteriaAndWrapper = new CriteriaAndWrapper().in(Constant::getId, ids);
        return findListByQuery(criteriaAndWrapper, clazz);
    }

    /**
     * 根据id集合查找
     *
     * @param ids id集合
     * @param clazz 类
     * @return List 列表
     */
    public  List findListByIds(Collection ids, SortBuilder sortBuilder, Class clazz) {
        CriteriaAndWrapper criteriaAndWrapper = new CriteriaAndWrapper().in(Constant::getId, ids);
        return findListByQuery(criteriaAndWrapper, sortBuilder, clazz);
    }

    /**
     * 根据id集合查找
     *
     * @param ids id集合
     * @param clazz 类
     * @return List 列表
     */
    public  List findListByIds(String[] ids, SortBuilder sortBuilder, Class clazz) {
        return findListByIds(Arrays.asList(ids), sortBuilder, clazz);
    }

    /**
     * 根据id集合查找
     *
     * @param ids id集合
     * @param clazz 类
     * @return List 列表
     */
    public  List findListByIds(String[] ids, Class clazz) {
        SortBuilder sortBuilder = new SortBuilder(Constant::getId, Direction.DESC);
        return findListByIds(ids, sortBuilder, clazz);
    }

    /**
     * 查询全部
     *
     * @param  类型
     * @param clazz 类
     * @return List 列表
     */
    public  List findAll(Class clazz) {
        SortBuilder sortBuilder = new SortBuilder(Constant::getId, Direction.DESC);
        return findListByQuery(new CriteriaAndWrapper(), sortBuilder, clazz);
    }

    /**
     * 查询全部
     *
     * @param  类型
     * @param clazz 类
     * @return List 列表
     */
    public  List findAll(SortBuilder sortBuilder, Class clazz) {
        return findListByQuery(new CriteriaAndWrapper(), sortBuilder, clazz);
    }

    /**
     * 查找全部的id
     *
     * @param clazz 类
     * @return List 列表
     */
    public List findAllIds(Class clazz) {
        return findIdsByQuery(new CriteriaAndWrapper(), clazz);
    }

    /**
     * 查找数量
     *
     * @param criteriaWrapper 查询
     * @param clazz 类
     * @return Long 数量
     */
    public Long findCountByQuery(CriteriaWrapper criteriaWrapper, Class clazz) {
        Long systemTime = System.currentTimeMillis();
        Long count = null;

        Query query = new Query(criteriaWrapper.build());
        if (query.getQueryObject().isEmpty()) {
            count = mongoTemplate
                    .getCollection(mongoTemplate.getCollectionName(clazz))
                    .estimatedDocumentCount();
        } else {
            count = mongoTemplate.count(query, clazz);
        }

        logCount(clazz, query, systemTime);
        return count;
    }

    /**
     * 查找全部数量
     *
     * @param clazz 类
     * @return Long 数量
     */
    public Long findAllCount(Class clazz) {
        return findCountByQuery(new CriteriaAndWrapper(), clazz);
    }

    /**
     * 获取list中对象某个属性,组成新的list
     *
     * @param list 列表
     * @param clazz 类
     * @param property 属性
     * @return List 列表
     */
    @SuppressWarnings("unchecked")
    private  List extractProperty(List list, String property, Class clazz) {
        Set rs = new HashSet();
        for (Object object : list) {
            Object value = FieldUtil.getFieldValue(object, property);
            if (value != null && value.getClass().equals(clazz)) {
                rs.add((T) value);
            }
        }

        return new ArrayList(rs);
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy