MongoDB - Spring数据 - 如何忽略Map的属性名?

时间:2014-04-04 06:53:14

标签: spring mongodb spring-data spring-data-mongodb

我们将MongoDB与Spring数据结合使用,我们希望在某个集合中使用以下结构:

{
"_id" : ObjectId("533e525bbd40c5da7cd8c3f0"),
"_class" : "net.someClass.SomeClass",
"source_id" : "other_id",
"name" : {
    "NL" : "iets",
    "FR" : "quelque chose"
    }
}

但由于我们的名字"是一个自定义类" TranslatableString"其中包含一个属性TreeMap,mongoDB表示介于两者之间的级别:

{
"_id" : ObjectId("533e525bbd40c5da7cd8c3f0"),
"_class" : "net.someClass.SomeClass",
"source_id" : "other_id",
"name" : {
    "translations" : {
        "NL" : "iets",
        "FR" : "quelque chose"
        }
    }
}

Class TranslatableString:

public class TranslatableString {

@NotNull
@Size(min = 1)
private TreeMap<LanguageEnum, String> translations = new TreeMap<>();

public TranslatableString() {
    // empty default constructor
.............
}

是否有可能通过使用Spring数据注释来忽略此属性? 我知道@Transient的存在,但这忽略了完整的&#34;名称&#34;属性及其内容..

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我认为你应该使用MongoConverter。

首先,你必须在Spring上下文中configure the MongoConverter

因此,您需要两个转换器:一个用于在数据库中存储对象,另一个用于从数据库查询文档。这样的事情:

1)ReadConverter

public class SomeClassReadConverter implements Converter<DBObject, SomeClass> {

  public SomeClass convert(DBObject source) {
    SomeClass obj = new SomeClass();
      //do something...
    TranslatableString nameObj = new TranslatableString();
    nameObj.setTranslations((Map) source.get("name")); 
    obj.setName(nameObj);
      //do something...
    return obj;
  }

}

2)WriteConverter

public class SomeClassWriteConverter implements Converter<SomeClass, DBObject> {

  public DBObject convert(SomeClass source) {
    DBObject dbo = new BasicDBObject();
       // do something...
    dbo.put("name", source.getName().getTranslations());
      // do something...
    return dbo;
  }

}