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);
}
}