Spring Data MongoDB 如何去掉 _class 字段
在使用 Spring Data MongoDB 进行开发时,我们可能会注意到每个文档都包含一个名为 _class
的字段。这个字段是用来存储文档对应的 Java 类的全限定类名。默认情况下,Spring Data MongoDB 会自动在文档中添加这个字段,以便在进行查询时能够正确地将文档映射回对应的 Java 对象。
然而,有些时候我们可能希望去掉这个 _class
字段,比如为了减小存储空间的占用,或者为了提高查询性能。下面我们将介绍几种方法来实现这个目标。
1. 使用 @TypeAlias
注解
首先,我们可以使用 @TypeAlias
注解来指定文档对应的别名,而不是使用 Java 类的全限定类名作为别名。这样就能够去掉 _class
字段了。
我们可以在实体类上添加 @TypeAlias
注解,指定一个自定义的别名。例如:
@Document(collection = "my_collection")
@TypeAlias("my_entity")
public class MyEntity {
// ...
}
这样,保存到 MongoDB 中的文档将会包含一个 "_class" : "my_entity"
的字段,而不是一个完整的类名。
2. 自定义 MappingMongoConverter
第二种方法是自定义 MappingMongoConverter
,通过重写 getMappingContext
方法来配置一个不包含 _class
字段的 MappingMongoConverter
。
首先,我们需要创建一个继承自 MappingMongoConverter
的子类,并重写 getMappingContext
方法。在这个方法中,我们可以通过调用 DefaultMongoTypeMapper.setTypeKey("_class")
来将 _class
字段设置为空字符串,从而达到去掉 _class
字段的目的。
@Configuration
public class MongoConfiguration extends AbstractMongoConfiguration {
@Override
public MongoClient mongoClient() {
return new MongoClient();
}
@Override
protected String getDatabaseName() {
return "my_database";
}
@Override
public MappingMongoConverter mappingMongoConverter() throws Exception {
MappingMongoConverter converter = super.mappingMongoConverter();
converter.setMapKeyDotReplacement("#");
DefaultMongoTypeMapper typeMapper = new DefaultMongoTypeMapper(null);
typeMapper.setTypeKey("");
converter.setTypeMapper(typeMapper);
return converter;
}
}
这样,通过自定义的 MappingMongoConverter
,我们可以去掉 _class
字段。
3. 使用 @Transient
注解
第三种方法是在实体类中使用 @Transient
注解标记某个字段,使其不被映射到 MongoDB 中。
@Document(collection = "my_collection")
public class MyEntity {
@Id
private String id;
@Transient
private String ignoreMe;
// ...
}
在这种情况下,ignoreMe
字段将不会被映射到 MongoDB 中,因此也不会包含 _class
字段。
总结
通过使用 @TypeAlias
注解、自定义 MappingMongoConverter
或使用 @Transient
注解,我们可以在 Spring Data MongoDB 中去掉 _class
字段。具体选择哪种方法取决于实际需求和项目的情况。