Spring Data MongoDB remove _class column
By default, SpringData’s MappingMongoConverter
add an extra “_class” column for every object saved in MongoDB. For example,
public class User {
String username;
String password;
//...getters and setters
}
Save it
MongoOperations mongoOperation = (MongoOperations)ctx.getBean("mongoTemplate");
User user = new User("mkyong", "password123");
mongoOperation.save(user, "users");
Result
> db.users.find()
{
"_class" : "com.mkyong.user.User",
"_id" : ObjectId("5050aef830041f24ff2bd16e"),
"password" : "new password", "username" : "mkyong"
}
SpringData created this extra “_class” for a reason. To remove this extra “_class“, override the MappingMongoConverter
, and passing a new DefaultMongoTypeMapper(null)
.
Here we show you how to remove the _class in annotation or XML way.
1. Annotation
@Configuration
public class SpringMongoConfig{
public @Bean
MongoDbFactory mongoDbFactory() throws Exception {
return new SimpleMongoDbFactory(new Mongo(), "database");
}
public @Bean
MongoTemplate mongoTemplate() throws Exception {
//remove _class
MappingMongoConverter converter =
new MappingMongoConverter(mongoDbFactory(), new MongoMappingContext());
converter.setTypeMapper(new DefaultMongoTypeMapper(null));
MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory(), converter);
return mongoTemplate;
}
}
2. XML
Same thing, but in XML file.
<mongo:mongo host="localhost" port="27017" />
<mongo:db-factory dbname="database" />
<bean id="mappingContext"
class="org.springframework.data.mongodb.core.mapping.MongoMappingContext" />
<bean id="defaultMongoTypeMapper"
class="org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper">
<constructor-arg name="typeKey"><null/></constructor-arg>
</bean>
<bean id="mappingMongoConverter"
class="org.springframework.data.mongodb.core.convert.MappingMongoConverter">
<constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />
<constructor-arg name="mappingContext" ref="mappingContext" />
<property name="typeMapper" ref="defaultMongoTypeMapper" />
</bean>
<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />
<constructor-arg name="mongoConverter" ref="mappingMongoConverter" />
</bean>
3. Test it Again
Save it again, the “_class” is gone.
> db.users.find()
{
"_id" : ObjectId("random code"),
"password" : "new password", "username" : "mkyong"
}
new MappingMongoConverter(mongoDbFactory(), new MongoMappingContext()) —–> @deprecated
This is also working
MongoTemplate mongoTemplate = new MongoTemplate(getMongoClient(), dbName);
((MappingMongoConverter)mongoTemplate.getConverter()).setTypeMapper(new DefaultMongoTypeMapper(null));
Great!! Thanks for your post!!
Now, I am using a customized UserCredentials subclass that allows decrypt DB stored credentials. Something like that:
How can i combine my customized user credentials with your example? Thanks in advance