去掉MongoDB _class

在使用MongoDB进行开发时,我们经常会遇到一个字段名为"_class"的情况。这个字段的存在是由于Spring Data MongoDB的内部机制所致。在本文中,我们将介绍这个字段的作用,并探讨如何去掉它。

什么是"_class"字段?

在MongoDB中,每个文档都有一个"_class"字段。这个字段存储了文档所属的Java类的全限定名。Spring Data MongoDB使用这个字段来进行文档和POJO(Plain Old Java Object)之间的映射。

为什么会有"_class"字段?

Spring Data MongoDB的目标是提供一种简化MongoDB访问的方式。它通过将文档转换为Java对象来实现这一目标。为了实现文档和POJO之间的映射,Spring Data MongoDB需要知道每个文档所属的Java类。

在Java中,每个对象都有一个getClass()方法,可以返回对象所属的类。然而,在MongoDB中,文档只是一个普通的JSON对象,并没有类的概念。为了解决这个问题,Spring Data MongoDB引入了"_class"字段,用来存储Java类的全限定名。

如何去掉"_class"字段?

在大多数情况下,我们不需要手动去掉"_class"字段。Spring Data MongoDB会自动处理这个字段,我们只需要按照规范编写代码即可。

使用MongoTemplate进行操作

如果我们使用MongoTemplate来进行操作,可以通过设置DefaultMongoTypeMapper的typeMapper属性来去掉"_class"字段。示例如下:

@Configuration
public class MongoConfig extends AbstractMongoConfiguration {

    @Override
    public MongoClient mongoClient() {
        // 配置MongoDB连接
        return new MongoClient("localhost", 27017);
    }

    @Override
    protected String getDatabaseName() {
        // 指定数据库名称
        return "mydb";
    }

    @Override
    public CustomConversions customConversions() {
        // 配置MongoDB类型转换
        return new MongoCustomConversions(Collections.emptyList());
    }

    @Bean
    public MongoTemplate mongoTemplate(MongoDbFactory mongoDbFactory,
                                       MappingMongoConverter mappingMongoConverter) {
        // 获取MongoTemplate实例
        MongoTemplate template = new MongoTemplate(mongoDbFactory, mappingMongoConverter);
        // 设置typeMapper为DefaultMongoTypeMapper实例
        ((MappingMongoConverter) template.getConverter()).setTypeMapper(new DefaultMongoTypeMapper(null));
        return template;
    }

}

通过设置typeMapper为DefaultMongoTypeMapper实例,并将其传递给MappingMongoConverter,我们就可以去掉"_class"字段。

使用MongoRepository进行操作

如果我们使用MongoRepository来进行操作,可以通过设置MappingMongoConverter的typeMapper属性来去掉"_class"字段。示例如下:

@Configuration
public class MongoConfig extends AbstractMongoConfiguration {

    @Override
    public MongoClient mongoClient() {
        // 配置MongoDB连接
        return new MongoClient("localhost", 27017);
    }

    @Override
    protected String getDatabaseName() {
        // 指定数据库名称
        return "mydb";
    }

    @Override
    public CustomConversions customConversions() {
        // 配置MongoDB类型转换
        return new MongoCustomConversions(Collections.emptyList());
    }

    @Bean
    public MappingMongoConverter mappingMongoConverter(MongoDbFactory mongoDbFactory,
                                                       MongoMappingContext mongoMappingContext) {
        // 获取MappingMongoConverter实例
        MappingMongoConverter converter = new MappingMongoConverter(new DefaultDbRefResolver(mongoDbFactory),
                mongoMappingContext);
        // 设置typeMapper为DefaultMongoTypeMapper实例
        converter.setTypeMapper(new DefaultMongoTypeMapper(null));
        return converter;
    }

}

通过设置typeMapper为DefaultMongoTypeMapper实例,并将其传递给MappingMongoConverter,我们就可以去掉"_class"字段。

总结

在本文中,我们介绍了MongoDB中的"_class"字段以及它的作用。我们了解到,Spring Data MongoDB使用这个字段进行文档和POJO之间的映射。尽管这个字段在大多数情况下是隐式处理的,但我们也可以通过设置DefaultMongoTypeMapper来手动去掉它。

通过本文的介绍,相信读者对去掉MongoDB "_class"字段有了更深入的了解。希望本文能帮助读