使用saveAll保存FileMetadataEntity集合至MongoDB生成多文档的问题
问题解决方案
一、修复JSON字段名不匹配问题
JSON中的startIndex字段与实体类中的start字段无法自动映射,通过以下两种方式修复:
方案1:用Jackson注解指定映射关系
在FileMetadataEntity的start字段上添加@JsonProperty注解,绑定JSON中的字段名:
public class FileMetadataEntity { // 其他字段... @JsonProperty("startIndex") private Integer start; // getter、setter方法 }
方案2:统一实体类与JSON字段名
直接将实体类中的start字段改名为startIndex,保持和JSON字段一致:
public class FileMetadataEntity { // 其他字段... private Integer startIndex; // getter、setter方法 }
二、修复MongoDB生成多个文档的问题
saveAll方法会把集合中的每个对象作为独立文档存入MongoDB,这和你“单个文档包含所有元数据数组”的预期不符,需要通过父实体包裹数组的方式实现需求:
1. 创建包裹类
定义一个包含元数据数组的父实体,指定MongoDB集合名称:
@Document(collection = "file_metadata") public class FileMetadataWrapper { @Id private String id; private List<FileMetadataEntity> fields; // 全参/无参构造器 // getter、setter方法 }
2. 定义对应Repository
创建针对包裹类的Repository接口:
public interface FileMetadataWrapperRepository extends MongoRepository<FileMetadataWrapper, String> { }
3. 修改业务逻辑
在MetadataService中,将解析后的元数据列表放入包裹类,再调用save方法保存单个包裹对象:
// 原逻辑:fileMetadataRepository.saveAll(fieldsList); // 修改后: FileMetadataWrapper wrapper = new FileMetadataWrapper(); wrapper.setFields(fieldsList); fileMetadataWrapperRepository.save(wrapper);
修改后MongoDB中会生成一个包含fields数组的单文档,而非多个独立文档。
内容的提问来源于stack exchange,提问作者Justin Fulkerson
相关产品推荐
相关产品推荐

