MongoDB最佳实践

Java推荐使用spring-data-mongodb来进行MongoDB的数据库操作,主要通过MongoTemplate和MongoRepository两种方式进行操作。

  • MongoRepository简单易用,不需要自己实现,只需要按规定的方法名定义即可,具有一定的使用局限性(如无法动态查询和更新),灵活性不高。
  • MongoTemplate拥有非常好的灵活性,可以自定义实现动态查询和更新。(推荐使用)

避坑:如实体类中需要在字段上使用@Indexed来进行添加索引,则@Document不能省略,否则@Indexed无效。此外经过论证在添加@Document情况下首次是可以成功创建索引的,但是如果把集合删了在不重启服务器的情况下,再次执行插入文档还是无法创建索引。

下面是自定义将实体转换为Update的通用工具类:

@Slf4j
public class MongoUtils {

    private MongoUtils(){}

    public static Update fittingUpdate(Object obj) {
        List<String> ignoreProps = new ArrayList<>();
        ignoreProps.add("id");
        ignoreProps.add("serialVersionUID");
        return fittingUpdate(obj, ignoreProps);
    }

    public static Update fittingUpdate(Object obj, List<String> ignoreProps) {
        Update update = new Update();
        Class<?> clazz = obj.getClass();
        try {
            for (; clazz != null; clazz = clazz.getSuperclass()){
                Field[] fields = clazz.getDeclaredFields();
                for (Field field : fields) {
                    field.setAccessible(true);
                    String fieldName = field.getName();
                    if(CollectionUtils.isEmpty(ignoreProps) || !ignoreProps.contains(fieldName)){
                        Object value = field.get(obj);
                        if(value != null){
                            if(value instanceof String && StringUtils.isBlank((String) value)){
                                continue;
                            }
                            update.set(fieldName, value);
                        }
                    }
                }
            }
        } catch (IllegalAccessException e) {
            log.error("fittingUpdate() happens illegalAccessException", e);
            throw new RuntimeException("Happens illegalAccessException");
        }
        return update;
    }

    public static void main(String[] args) throws IllegalAccessException {
        MonitorConfig monitorConfig = new MonitorConfig();
        monitorConfig.setClassName("12");
        monitorConfig.setMonitorType( 13);
        monitorConfig.setDingTokenList(Lists.newArrayList("1", "2"));
        Update update = fittingUpdate(monitorConfig);
        System.out.println(update);
    }
}

转载于:https://my.oschina.net/xujiangjun/blog/3027945

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值