2016-05-04 13 views
1

私は私がモデルだろう、私はテンプレートという名前の新しいフィールドを追加し、他の言葉で、動的このフィールドをマップする必要が春データのMongoDBマッピングダイナミックフィールド

@Document 
public class Template { 

    private String type; 

    private String code; 

    @Version 
    Long version; 
} 

私のJavaクラスでこのモデルをしましたこのような文書

{ 
    _id: 'id' 
    type:'myType', 
    code:'myCode' 
    template:{ 
    someFiled:[ 
     { 
     subField1:'value1', 
     subField2:'value2' 
     }, 
     { 
     sub1Field1:'1value1', 
     sub1Field2:'1value2' 
     } 
     ....................... 
    ], 
    otherField:[ 
     { 
     otherField1:'value1', 
     otherField2:'value2' 
     } 
    ], 
    ......... 
    }, 
    version:1000L 
} 

フィールドを動的に注釈する方法はありますか?

SOLUTION

@Document 
    public class Template { 

     private String type; 

     private String code; 

     private Map<String, Object> template; 

     @Version 
     Long version; 
    } 
+0

あなたが「ダイナミック」と言うとき、あなたは正確に何を意味しています:「スキーマが事前に知られていません」か「それに構造物が入れ子になっている」か、あるいはその両方が混在しているか? –

+0

@MarcTarin私はスキーマを前もって知っていませんが、本質的にそれはネストされた構造です –

+0

JsonObjectをフィールドとして追加すると、その中にドキュメントを追加できます。 – user1211

答えて

0

私は完璧な解決策を見つけました。例えば私のプロジェクトを取る:

@Data 
@Document(collection = "logs") 
public class Log { 
    @Id 
    private String id; 
    private Object data; 

    // data field can be a string 
    public void setData(String str) { 
     data = str; 
    } 
    // data field can be a {} 
    public void setData(JsonObject jsonObject) { 
     data = new BasicDBObject(jsonObject.getMap()); 
    } 
    // data can be a [] 
    public void setData(JsonArray jsonArray) { 
     BasicDBList list = new BasicDBList(); 
     list.addAll(jsonArray.getList()); 
     data = list; 
    } 
} 

はそれのためセッターの3種類を実装し、Objectの種類としてdataフィールドを宣言します。ここで

は、テスト・ケースです:

@RunWith(SpringRunner.class) 
@SpringBootTest 
public class LogRepositoryTest { 

    @Autowired 
    private LogRepository logRepository; 

    @Test 
    public void test() { 
     Log strLog = new Log(); 
     strLog.setData("string here"); 
     logRepository.save(strLog); 
     Log objLog = new Log(); 
     objLog.setData(new JsonObject().put("key", "value").put("obj", new JsonObject())); 
     logRepository.save(objLog); 
     Log aryLog = new Log(); 
     aryLog.setData(new JsonArray().add("a").add("b").add("c")); 
     logRepository.save(aryLog); 
    } 
} 

そして結果:

{ 
     "_id" : ObjectId("5a09fa46a15b065268a0a157"), 
     "_class" : "ltd.linkcon.spider.domain.Log", 
     "data" : "string here" 
} 
{ 
     "_id" : ObjectId("5a09fa46a15b065268a0a158"), 
     "_class" : "ltd.linkcon.spider.domain.Log", 
     "data" : { 
       "key" : "value", 
       "obj" : [ ] 
     } 
} 
{ 
     "_id" : ObjectId("5a09fa46a15b065268a0a159"), 
     "_class" : "ltd.linkcon.spider.domain.Log", 
     "data" : [ 
       "a", 
       "b", 
       "c" 
     ] 
} 
+0

この解決策は、春がマッピング中に '' '_class'''と' 'map'''フィールドを追加するのを避けることもできます。 –

関連する問題