5

我有一个可以具有动态键名的文档:

{
"_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 中创建将映射此文档的实体类的最佳方法是什么?

4

2 回答 2

2

这就是我要做的。

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>您可以在需要时使用 String 键探索的,并且可以具有嵌套 Map。

对于您的依赖项,最好不要BasicDBObject直接公开该字段,因此可以通过接口在不包含任何 MongoDb 库的代码中使用它。

请注意,如果 envinfo 中有一些经常访问的字段,那么最好将它们声明为您的类中的字段,拥有一个直接访问器,这样就不要花太多时间一次又一次地浏览地图。

于 2014-08-01T12:42:57.623 回答
2

这是一种方法。可能还有其他更好的方法。

创建一个属性映射并将该映射存储在 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 中,并将这些属性保留在属性映射之外。

于 2013-07-27T16:53:31.163 回答