Spring Data MongoDB - 忽略空对象

时间:2017-06-09 12:14:18

标签: mongodb spring-data-mongodb

我将Spring Data与MongoDB一起使用来保存一些文档。保存文档时,我希望Mongo不包含空对象。 (如何)可以实现这一目标?

说我有以下主要课程:

select *
  , expirydatetime2 = dateadd(millisecond
        ,datediff(millisecond,0,convert(time(7),w.expirytime))
        ,convert(datetime2(7),w.expirydate)
      )
from works w
where dateadd(millisecond
        ,datediff(millisecond,0,convert(time(7),w.expirytime))
        ,convert(datetime2(7),w.expirydate)
      ) < sysdatetime()

包含以下类的对象:

@Document(collection = "main_doc")
public class MainDoc {
    @Id
    private String id;

    private String title;
    private SubDoc subDoc;
}

现在,如果我尝试保存以下对象:

public class SubDoc {

    private String title;
    private String info;

}

注意:实际上我并没有控制SubDoc这样设置的事实。它可以是空的或填充。我想要的是,如果元素的属性/字段都是NULL,它根本不会存储在mongo中。 这导致mongo中出现类似的情况:

MainDoc main = new MainDoc();
main.setTitle("someTitle");
main.setSubDoc(new SubDoc());

我想要的是,如果一个元素只包含null属性,它们根本就没有保存,所以对于上面的例子,我希望得到以下结果:

{
    "_id" : "5a328f9a-6118-403b-a3a0-a55ce52099f3",
    "title": "someTitle",
    "subDoc": {}
}

在存储库的帮助下保存文档如下:

{
    "_id" : "5a328f9a-6118-403b-a3a0-a55ce52099f3",
    "title": "someTitle"
}

提前致谢。

1 个答案:

答案 0 :(得分:2)

您可以在此处执行的操作是为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);

如果您不想为您的对象编写自定义转换器,可以使用默认转换器并稍微修改它。

{}

实际上这不是最好的方式。正如大家写的那样,空对象应该存储为python manage.py makemigrations,但转换器可以帮助你解决问题。