diff --git a/mongo-plus-core/src/main/java/com/mongoplus/handlers/condition/BuildCondition.java b/mongo-plus-core/src/main/java/com/mongoplus/handlers/condition/BuildCondition.java index 3f708c2fab79ded40068dabb748fe811c8cb7a58..4b57174f3618d9d207880a90e0b22083815dfd9f 100644 --- a/mongo-plus-core/src/main/java/com/mongoplus/handlers/condition/BuildCondition.java +++ b/mongo-plus-core/src/main/java/com/mongoplus/handlers/condition/BuildCondition.java @@ -285,12 +285,16 @@ public class BuildCondition extends AbstractCondition { CompareCondition currentCompareCondition = buildUpdate.getCurrentCompareCondition(); BasicDBObject updateBasicDBObject = buildUpdate.getUpdateBasicDBObject(); Object value = currentCompareCondition.getValue(); - if (ClassTypeUtil.isTargetClass(Collection.class,value.getClass())) { - Bson pushOptions = buildPushOptions(currentCompareCondition.getValue(List.class), - currentCompareCondition.getExtraValue(PushOptions.class)); - updateBasicDBObject.put(currentCompareCondition.getColumn(),pushOptions); + if (ClassTypeUtil.isTargetClass(Collection.class, value.getClass())) { + PushOptions extraValue = currentCompareCondition.getExtraValue(PushOptions.class); + if (Objects.isNull(extraValue)) { + put(updateBasicDBObject, currentCompareCondition); + } else { + Bson pushOptions = buildPushOptions(currentCompareCondition.getValue(List.class), extraValue); + updateBasicDBObject.put(currentCompareCondition.getColumn(), pushOptions); + } } else { - put(updateBasicDBObject,currentCompareCondition); + put(updateBasicDBObject, currentCompareCondition); } return updateBasicDBObject; } diff --git a/mongo-plus-core/src/main/java/com/mongoplus/mapping/MappingMongoConverter.java b/mongo-plus-core/src/main/java/com/mongoplus/mapping/MappingMongoConverter.java index f54dd0a70f744332002bf6ae1d8f13011a44da91..b6ec9fdf815035a98359191d58c7d551eefd0454 100644 --- a/mongo-plus-core/src/main/java/com/mongoplus/mapping/MappingMongoConverter.java +++ b/mongo-plus-core/src/main/java/com/mongoplus/mapping/MappingMongoConverter.java @@ -258,7 +258,11 @@ public class MappingMongoConverter extends AbstractMongoConverter { try { if (ClassTypeUtil.isTargetClass(Collection.class,clazz)) { - return handleCollectionType(sourceObj, typeReference, clazz, conversionStrategy); + if (isMultiDimensionalCollection(typeReference)) { + return handleDefaultType(sourceObj, clazz, conversionStrategy); + } else { + return handleCollectionType(sourceObj, typeReference, clazz, conversionStrategy); + } } else if (ClassTypeUtil.isTargetClass(Map.class,clazz)) { return handleMapType(sourceObj, typeReference, clazz, conversionStrategy); } else { @@ -427,4 +431,34 @@ public class MappingMongoConverter extends AbstractMongoConverter { return map; } + + /** + * 是否是多位数组 + */ + private boolean isMultiDimensionalCollection(TypeReference typeRef) { + // 1. 检查是否为参数化类型(带泛型) + if (!(typeRef.getType() instanceof ParameterizedType)) { + return false; // 非泛型类型,直接返回false + } + ParameterizedType paramType = (ParameterizedType) typeRef.getType(); + Type[] genericTypes = paramType.getActualTypeArguments(); + // 2. 检查每个泛型参数 + for (Type genericType : genericTypes) { + if (genericType instanceof Class) { + // 如果泛型参数是集合类 + if (Collection.class.isAssignableFrom((Class) genericType)) { + return true; + } + } else if (genericType instanceof ParameterizedType) { + ParameterizedType nestedType = (ParameterizedType) genericType; + Type rawType = nestedType.getRawType(); + // 3. 如果泛型参数本身是集合类型 + if (rawType instanceof Class && Collection.class.isAssignableFrom((Class) rawType)) { + return true; + } + } + } + return false; + } + }