3

스프링 데이터와 mongodb를 처음 사용합니다. JSON 스키마를 나타내는 JSON 객체가 있고이를 스프링 데이터를 사용하여 mongodb에 저장해야합니다. 하지만 JSON 스키마의 문제는 JSON 스키마의 구조가 동적이라는 점입니다. 예를 들어 완전히 다른 구조를 가진 두 개의 유효한 JSON 스키마가 아래에 나와 있습니다. 내가 정의 된 클래스 위의 JSON을 매핑하여 MongoDB에 저장할 수 있도록 스프링이있는 mongodb에 JSON 스키마 저장


{ 
    "type": "array", 
    "items": { 
     "type": "object", 
     "properties": { 
      "abc": { 
       "type": "boolean" 
      }, 
      "xyz": { 
       "$ref": "#/definitions/" 
      }, 
      "asd": { 
       "type": "null" 
      } 
     }, 
     "required": [ 
      "abc", 
      "xyz" 
     ] 
    } 
} 

{ 
    "type": "object", 
    "properties": { 
     "name": { 
      "type": "string", 
      "minLength": 10 
     }, 
     "age": { 
      "type": "integer" 
     } 
    }, 
    "required": [ 
     "name", 
     "age" 
    ] 
} 

어떻게 자바 POJO 클래스를 정의 할 수 있습니다. 또는 POJO 클래스에 매핑하지 않고 봄에 CURD 연산을 수행 할 수 있습니까? 내 프로젝트에서

답변

3

나는 MongoTemplate를 사용하는 것이 좋습니다 및 직렬화 및 Gson/Jackson 사용 deserailize 것이다.

Mongo 템플릿에는 mongo java 드라이버를 직접 사용하는 것과 매우 유사한 컬렉션 이름과 DBObject 엔티티를 사용하는 CRUD 메소드가 있습니다.

그러면 json 페이로드가 있고 매퍼 라이브러리 중 하나를 사용하여 Map으로 변환 할 수 있습니다.

뭔가

같은 Deserialise

ObjectMapper mapper = new ObjectMapper(); 
TypeReference<HashMap<String,Object>> typeRef 
     = new TypeReference<HashMap<String,Object>>() {}; 
HashMap<String,Object> map = mapper.readValue(jsonpayload, typeRef); 

DBOBJECT

DBObject dbObject = new BasicDBObject(map); 

MongoTemplate는

mongoTemplate.save(dbObject, "collectionname"); 

당신은 다른 모든 CRUD 작업을위한 비슷한 일을 할 수 있습니다.

1

나는 나의 모델의 매우 역동적 구조를했고 나는 java.util.Map 객체

이 내 몬도 문서 모델이 구현되었습니다 어떻게 사용하여 그것들을 매핑이를 사용하여

@Document(collection = "e_form_data") 
public class FormDataModel extends AbstractModel 
{ 
    private static final long serialVersionUID = -1733975205300782871L; 
    @Field 
    @Indexed(name = "e_form_id_idx") 
    private String eFormId; 
    @Field 
    private Map<String, Object> eFormData; 

    public FormDataModel() 
    { 
     super(); 
    } 

    public FormDataModel(String id, String creatoDa, String modificatoDa, Date dataCreazione, Date dataModifica, String eFormId, Map<String, Object> eFormData) 
    { 
     super(id, creatoDa, modificatoDa, dataCreazione, dataModifica); 
     this.eFormData = eFormData; 
     this.eFormId = eFormId; 
    } 

    public FormDataModel(Map<String, Object> eFormData) 
    { 
     super(); 
     this.eFormData = eFormData; 
    } 

    public Map<String, Object> geteFormData() 
    { 
     return eFormData; 
    } 

    public void seteFormData(Map<String, Object> eFormData) 
    { 
     this.eFormData = eFormData; 
    } 

    public String geteFormId() 
    { 
     return eFormId; 
    } 

    public void seteFormId(String eFormId) 
    { 
     this.eFormId = eFormId; 
    } 

    public String getDataInserimento() 
    { 
     return Utils.formatDateTime(new DateTime(this.dataCreazione.getTime()), "dd/MM/yyyy"); 
    } 

    @Override 
    public String toString() 
    { 
     return "FormDataModel [eFormId=" + eFormId + ", eFormData=" + eFormData + "]"; 
    } 

} 

을 꽤 좋은 모든 작품

+0

답장을 보내 주셔서 감사합니다.하지만 여전히 제안하는지도에 JSON 구조를 매핑하는 방법을 모르겠습니까? – BiJ

1

사용 포함 된 문서를 매핑 할 수 있습니다 @DBref

@Document(collection = "first") 
public class First { 

    @Id 
    private String id; 

    @DBRef 
    private Properties properties; 

    @Field 
    private List<String> required; 

    // constructor 
    // getters and setter  
} 

public class Properties { 

    @Id 
    private String id; 

    @DBRef 
    private Name name; 

    @DBRef 
    private Age age; 

    // constructor 
    // getters and setter 
} 

public class Name { ... } 
public class Age { ... } 

http://docs.spring.io/spring-data/data-mongo/docs/1.4.2.RELEASE/reference/html/mapping-chapter.html#mapping-usage-references

또는 안젤로 Immediata 등

http://www.baeldung.com/cascading-with-dbref-and-lifecycle-events-in-spring-data-mongodb

@Document(collection = "first") 
public class First { 

    @Id 
    private String id; 

    @Field 
    private Map<String, Object> properties; 

    @Field 
    private List<String> required; 

    // constructor 
    // getters and setter  
} 

제안 그리고 당신은 여기

http://docs.spring.io/spring-data/data-mongo/docs/1.4.2.RELEASE/reference/html/mapping-chapter.html#mapping-explicit-converters

+0

당신이 준 예제, Name, Age 등의 클래스를 정의했습니다. 여기서는 상수라고 가정합니다. 내 두 번째 예제를 보면 필드가 다르다. abc, xyz 등. 내 질문은 두 가지 시나리오에서 모두 사용할 수있는 일반적인 방법을 찾는 방법입니다. – BiJ

+0

Java Object 또는 Map 또는 com.mongodb.DBObject 또는 com.mongodb.BasicDBObject com.mongodb.BasicDBList에 동적 데이터를 넣어야합니다. 이 게시물 확인 http://stackoverflow.com/a/35921264/1582089 – Cassian

2

이 찾아주세요 일부 사용자 지정 읽기 및 쓰기 컨버터에게 필요한 코드가 필요합니다 . 여기

@lombok.Data 
@JsonInclude(JsonInclude.Include.NON_NULL) 
@JsonIgnoreProperties(ignoreUnknown = true) 
public class Bounty { 

    String type; 
    Map<String, Object> items; 
    Map<String, Object> properties; 
    List<Object> required; 
} 

내 저장소 클래스

public interface BountyRepository extends MongoRepository<Bounty, String> { 
} 

입니다 그리고 여기에 u는 저장 후 몽고처럼 보이는 방법이있다

@GetMapping("/insert/{number}") 
    public void insert(@PathVariable int number){ 
     bountyRepository.save(getBounty(number)); 
    } 


    public Bounty getBounty(int number){ 
     ObjectMapper objectMapper = new ObjectMapper(); 
     String jsonString1 = "{\n" + 
      " \"type\": \"object\",\n" + 
      " \"properties\": {\n" + 
      "  \"name\": {\n" + 
      "   \"type\": \"string\",\n" + 
      "   \"minLength\": 10\n" + 
      "  },\n" + 
      "  \"age\": {\n" + 
      "   \"type\": \"integer\"\n" + 
      "  }\n" + 
      " },\n" + 
      " \"required\": [\n" + 
      "  \"name\",\n" + 
      "  \"age\"\n" + 
      " ]\n" + 
      "}"; 


     String jsonString2 = "{\n" + 
      " \"type\": \"array\",\n" + 
      " \"items\": {\n" + 
      "  \"type\": \"object\",\n" + 
      "  \"properties\": {\n" + 
      "   \"abc\": {\n" + 
      "    \"type\": \"boolean\"\n" + 
      "   },\n" + 
      "   \"xyz\": {\n" + 
      "    \"$ref\": \"#/definitions/\"\n" + 
      "   },\n" + 
      "   \"asd\": {\n" + 
      "    \"type\": \"null\"\n" + 
      "   }\n" + 
      "  },\n" + 
      "  \"required\": [\n" + 
      "   \"abc\",\n" + 
      "   \"xyz\"\n" + 
      "  ]\n" + 
      " }\n" + 
      "}"; 

     try { 
      Bounty bounty1 = objectMapper.readValue(jsonString1, Bounty.class); 
      Bounty bounty2 = objectMapper.readValue(jsonString2, Bounty.class); 


      if (number == 1) return bounty1; 
      if (number == 2) return bounty2; 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

그것을 밖으로 시도하는 데 사용할 수있는 컨트롤러 조각입니다 .

/* 1 */ 
{ 
    "_id" : ObjectId("58da2390fde4f133178499fa"), 
    "_class" : "pani.kiran.sumne.model.Bounty", 
    "type" : "object", 
    "properties" : { 
     "name" : { 
      "type" : "string", 
      "minLength" : 10 
     }, 
     "age" : { 
      "type" : "integer" 
     } 
    }, 
    "required" : [ 
     "name", 
     "age" 
    ] 
} 

/* 2 */ 
{ 
    "_id" : ObjectId("58da23adfde4f133178499fb"), 
    "_class" : "pani.kiran.sumne.model.Bounty", 
    "type" : "array", 
    "items" : { 
     "type" : "object", 
     "properties" : { 
      "abc" : { 
       "type" : "boolean" 
      }, 
      "xyz" : { 
       "$ref" : "#/definitions/" 
      }, 
      "asd" : { 
       "type" : "null" 
      } 
     }, 
     "required" : [ 
      "abc", 
      "xyz" 
     ] 
    } 
}