2013-07-27 29 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中存在一些频繁访问的字段,那么最好将它们声明为类中的字段,以便拥有直接访问者,因此不会花费太多时间再次浏览地图并且再次。