MongoHelper工具类库

package com.jimi.tracker.mongo;

import com.google.common.collect.Lists;
import com.jimi.tracker.model.DeviceInfo;
import com.khan.utils.JacksonUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.BulkOperations;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * Description:
 * 

* *

* * @Author: leo.xiong * @CreateDate: 2025/6/26 9:45 * @Email: * @Since: */
@Slf4j @Service public class MongoHelper { @Autowired private MongoTemplate mongoTemplate; /** * 批量插入更新设备信息 * * @param deviceInfoList */ public void batchUpdateOrInsertDeviceInfo(List<DeviceInfo> deviceInfoList, String... ignoreFieldNames) { batchUpdateOrInsert(deviceInfoList, (deviceInfo) -> new Query(Criteria.where("imei").is(deviceInfo.getImei())), ignoreFieldNames); } public void batchDeleteDeviceInfoByIds(List<String> imeiList) { batchDelete(imeiList, DeviceInfo.class, (imei) -> new Query(Criteria.where("imei").is(imei))); } private <D, T> void batchDelete(List<D> idList, Class<T> clazz, Function<D, Query> function) { if (CollectionUtils.isEmpty(idList)) { return; } BulkOperations bulkOps = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, clazz); for (D id : idList) { bulkOps.remove(function.apply(id)); } bulkOps.execute(); } /** * 批量更新或插入 * * @param list * @param function * @param ignoreFieldNames * @param */ private <T> void batchUpdateOrInsert(List<T> list, Function<T, Query> function, String... ignoreFieldNames) { if (CollectionUtils.isEmpty(list)) { return; } Class<T> clazz = (Class<T>) list.get(0).getClass(); BulkOperations bulkOps = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, clazz); List<Field> fields = getFields(clazz, ignoreFieldNames); for (T t : list) { //ID(IMEI)相同,更新,不存在插入 bulkOps.upsert(function.apply(t), createUpdate(t, fields)); } bulkOps.execute(); } private <T> List<Field> getFields(Class<T> clazz, String... ignoreFieldNames) { Field[] fields = clazz.getDeclaredFields(); if (ignoreFieldNames == null || ignoreFieldNames.length == 0) { return Lists.newArrayList(fields); } List<String> ignoreFieldNameList = Lists.newArrayList(ignoreFieldNames); List<Field> fieldList = Arrays.stream(fields) .filter(field -> !field.isAnnotationPresent(Id.class) && !ignoreFieldNameList.contains(field.getName())) .collect(Collectors.toList()); return fieldList; } /** * 创建Update对象 * * @param obj * @return */ private Update createUpdate(Object obj, List<Field> fields) { Update update = new Update(); boolean canAccess = false; for (Field field : fields) { try { canAccess = field.canAccess(obj); field.setAccessible(true); Object value = field.get(obj); if (value != null) { update.set(field.getName(), value); } } catch (IllegalAccessException e) { log.error("Reflection property failed obj:{} fieldName:{}", JacksonUtils.toJson(obj), field.getName(), e); } finally { field.setAccessible(canAccess); } } return update; } }

你可能感兴趣的:(MongoHelper工具类库)