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

これは 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 に追加して、それらを属性マップから除外することができます。

于 2013-07-27T16:53:31.163 に答える
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 );
    }

}

このようにして、必要に応じて文字列キーで探索でき、ネストされた Map を持つことができる をgetInfos()返します。Map<String,Object>

依存関係については、BasicDBObjectフィールドを直接公開しない方がよいため、MongoDb ライブラリを含まないコードでインターフェースを介して使用できます。

envinfo に頻繁にアクセスされるフィールドがいくつかある場合は、それらをクラス内のフィールドとして宣言し、直接アクセサーを用意して、マップを何度も参照するのに多くの時間を費やさないようにすることをお勧めします。

于 2014-08-01T12:42:57.623 に答える