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 字段。具体选择哪种方法取决于实际需求和项目的情况。