Spring 数据 MongoDB - 忽略空对象
Spring Data MongoDB - ignore empty objects
我正在使用 Spring 数据和 MongoDB 来保存一些文档。保存文档时,我希望 Mongo 不包含空对象。 (如何)可以实现?
假设我有以下主要 class:
@Document(collection = "main_doc")
public class MainDoc {
@Id
private String id;
private String title;
private SubDoc subDoc;
}
包含以下 class 的对象:
public class SubDoc {
private String title;
private String info;
}
现在,如果我尝试保存以下对象:
MainDoc main = new MainDoc();
main.setTitle("someTitle");
main.setSubDoc(new SubDoc());
注意:实际上SubDoc是这样设置的,我无法控制。可以是空的,也可以是填的。我要的是,如果一个元素的properties/fields全为NULL,那么根本不会存入mongo。
这会在 mongo:
中产生类似的结果
{
"_id" : "5a328f9a-6118-403b-a3a0-a55ce52099f3",
"title": "someTitle",
"subDoc": {}
}
我想要的是,如果一个元素只包含空属性,它们根本不会被保存,所以对于上面的例子,我想要以下结果:
{
"_id" : "5a328f9a-6118-403b-a3a0-a55ce52099f3",
"title": "someTitle"
}
文档的保存是在存储库的帮助下完成的,如下所示:
@NoRepositoryBean
public interface MainRepo extends CrudRepository<MainDoc, String> {
// save inherited
}
提前致谢。
您可以在这里做的一件事是为 MainDoc
:
编写自定义转换器
public class MainDocConverter implements Converter<MainDoc, DBObject> {
@Override
public DBObject convert(final MainDoc source) {
final BasicDbObject dbObject = new BasicDBObject();
...
if(/* validate is subdoc is not null and not empty */) {
dbOject.put("subDoc", source.getSubDoc());
}
}
}
您可以在 @Configuration
文件中注册它,例如:
@Configuration
@EnableMongoRepositories(basePackages = {"package"})
public class MongoConfig {
private final MongoDbFactory mongoDbFactory;
public MongoConfig(final MongoDbFactory mongoDbFactory) {
this.mongoDbFactory = mongoDbFactory;
}
@Bean
public MongoTemplate mongoTemplate() throws Exception {
final MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory, getDefaultMongoConverter());
return mongoTemplate;
}
@Bean
public MappingMongoConverter getDefaultMongoConverter() throws Exception {
final MappingMongoConverter converter = new MappingMongoConverter(
new DefaultDbRefResolver(mongoDbFactory), new MongoMappingContext());
converter.setCustomConversions(new CustomConversions(Arrays.asList(new MainDocConverter())));
return converter;
}
}
如果您不想为您的对象玩具编写自定义转换器,可以使用默认转换器并稍微修改它。
final Document document = (Document) getDefaultMongoConverter().convertToMongoType(mainDoc);
if(/* validate is null or is empty */) {
document .remove("subDoc");
}
mongoTemplate().save(document);
其实这不是最好的方法。正如大家所写,空对象应该存储为 {}
,但转换器可以帮助您解决问题。
我正在使用 Spring 数据和 MongoDB 来保存一些文档。保存文档时,我希望 Mongo 不包含空对象。 (如何)可以实现?
假设我有以下主要 class:
@Document(collection = "main_doc")
public class MainDoc {
@Id
private String id;
private String title;
private SubDoc subDoc;
}
包含以下 class 的对象:
public class SubDoc {
private String title;
private String info;
}
现在,如果我尝试保存以下对象:
MainDoc main = new MainDoc();
main.setTitle("someTitle");
main.setSubDoc(new SubDoc());
注意:实际上SubDoc是这样设置的,我无法控制。可以是空的,也可以是填的。我要的是,如果一个元素的properties/fields全为NULL,那么根本不会存入mongo。 这会在 mongo:
中产生类似的结果{
"_id" : "5a328f9a-6118-403b-a3a0-a55ce52099f3",
"title": "someTitle",
"subDoc": {}
}
我想要的是,如果一个元素只包含空属性,它们根本不会被保存,所以对于上面的例子,我想要以下结果:
{
"_id" : "5a328f9a-6118-403b-a3a0-a55ce52099f3",
"title": "someTitle"
}
文档的保存是在存储库的帮助下完成的,如下所示:
@NoRepositoryBean
public interface MainRepo extends CrudRepository<MainDoc, String> {
// save inherited
}
提前致谢。
您可以在这里做的一件事是为 MainDoc
:
public class MainDocConverter implements Converter<MainDoc, DBObject> {
@Override
public DBObject convert(final MainDoc source) {
final BasicDbObject dbObject = new BasicDBObject();
...
if(/* validate is subdoc is not null and not empty */) {
dbOject.put("subDoc", source.getSubDoc());
}
}
}
您可以在 @Configuration
文件中注册它,例如:
@Configuration
@EnableMongoRepositories(basePackages = {"package"})
public class MongoConfig {
private final MongoDbFactory mongoDbFactory;
public MongoConfig(final MongoDbFactory mongoDbFactory) {
this.mongoDbFactory = mongoDbFactory;
}
@Bean
public MongoTemplate mongoTemplate() throws Exception {
final MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory, getDefaultMongoConverter());
return mongoTemplate;
}
@Bean
public MappingMongoConverter getDefaultMongoConverter() throws Exception {
final MappingMongoConverter converter = new MappingMongoConverter(
new DefaultDbRefResolver(mongoDbFactory), new MongoMappingContext());
converter.setCustomConversions(new CustomConversions(Arrays.asList(new MainDocConverter())));
return converter;
}
}
如果您不想为您的对象玩具编写自定义转换器,可以使用默认转换器并稍微修改它。
final Document document = (Document) getDefaultMongoConverter().convertToMongoType(mainDoc);
if(/* validate is null or is empty */) {
document .remove("subDoc");
}
mongoTemplate().save(document);
其实这不是最好的方法。正如大家所写,空对象应该存储为 {}
,但转换器可以帮助您解决问题。