2013-07-27 53 views
4

文件我有一個可以有動態密鑰名稱的文件:如何映射與動態密鑰到春節MongoDB的實體類

{ 
"_id" : ObjectId("51a29f6413dc992c24e0283e"), 
"envinfo" : { 
    "appName" : "MyJavaApp", 
    "environment" : { 
     "cpuCount" : 12, 
     "heapMaxBytes" : 5724766208, 
     "osVersion" : "6.2", 
     "arch" : "amd64", 
     "javaVendor" : "Sun Microsystems Inc.", 
     "pid" : 44996, 
     "javaVersion" : "1.6.0_38", 
     "heapInitialBytes" : 402507520, 
} 

這裏envinfo的鍵事先不知道。 什麼是在Spring Data Mongodb中創建實體類的最佳方式,它將映射此文檔?

+0

你是說同一個集合的另一個文檔會有_id和一個類似於envinfo的嵌入對象,但是被稱爲別的東西?像envinfo2? – Jayz

+0

我的意思是envinfo上的字段並未提前知道。在這裏他們是'cpuCount','arch'等,但他們可能是'coreCount',或其他。 – pdeva

回答

1

這是做到這一點的一種方式。可能還有其他更好的方法。

創建屬性的地圖並將地圖存儲在mongo中。

public class Env { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private ObjectId id; 
    @Field 
    private Envinfo envinfo; 

    public static class Envinfo { 
     @Field 
     private String appName; 
     @Field 
     private Map<String, String> attributes; 
    } 
} 

如果你預先知道鍵,您可以在Envinfo添加這些屬性,保留那些出的屬性圖。

+0

,但是不會在上面指望像envinfo {appName:「name,attributes {}}這樣的文檔。基本上,上面的'attributes'需要是envinfo的子文檔,這也沒有考慮到一些關鍵字包含其他子文檔 – pdeva

+1

它是mongodb,除了id之外它不指望其他任何東西(除非使用spring註釋使其成爲必填字段)如果可以有其他子文檔,則使用「private Map 屬性;「,但後來它變得繁瑣且完全沒有模式,這不是mongo的原因,你應該考慮使用不同的持久性解決方案。 – Jayz

1

這是我要做的。

class EnvDocuemnt { 

    @Id 
    private String id; //getter and setter omitted 

    @Field(value = "envinfo") 
    private BasicDBObject infos; 

    public Map getInfos() { 
     // some documents don't have any infos, in this case return null... 
     if (null!= infos) 
      return infos.toMap(); 
     return null; 
    } 

    public void setInfos(Map infos) { 
     this.infos = new BasicDBObject(infos); 
    } 

} 

這樣,getInfos()返回Map<String,Object>你可以在需要時使用字符串鍵瀏覽,而且可以嵌套地圖。

對於你的依賴關係,最好不要直接暴露BasicDBObject字段,所以這可以通過接口在不包含任何MongoDb庫的代碼中使用。

請注意,如果envinfo中存在一些頻繁訪問的字段,那麼最好將它們聲明爲類中的字段,以便擁有直接訪問者,因此不會花費太多時間再次瀏覽地圖並且再次。