Java class를 이용해서 mongoDB에 저장하면서 spring에서 지원하는 mongoTemplate을 쓰는게 가장 편한데,
가끔은 이 방법이 불편할 때가 있다.
Class가 Collection에 1:1 대응되지만, Colletion에 필드가 너무 만은데
몇개만 front-End로 리턴해야 한다던지 하는 경우에 매우 불편할 수 있는데, 이럴때 좋은게 Json Document 이다.
주로 사용하게 되는 class는
JSONObject, JSONArray (net.minidev.json 패키지)
Document (mongoDB 저장된 record org.bson 패키지)
이렇게 3가지 이며,
JSONObject <-> Document간 변환을 주로 하게된다.
1. Doc으로 변환 후 mongoDB에 저장시에는
(MongoDBConnection mongoConn). getCollection("컬렉션명").insertOne( oneDoc ); 과 같이 하면 된다.
Document doc = mongoConn.getCollection("...").find(); //or filter(new FIlter....).find()
2. Doc을 다룰 때 많이 쓰는 함수는
Document 생성. doc.append
doc.get("fieldName") => Document가 되기도 하고 List<Document>가 되기도 하고 자동.
기타: (JSONObject <-> Document간 변환용 함수들)
public static Document jsonToDoc(JSONObject json) {
try {
Document doc = Document.parse(json.toString());
return doc;
} catch(Exception ex) {
return null;
}
}
public static ArrayList<Document> jsonArrayToDoc(JSONArray json) {
try {
final ArrayList<Document> result = new ArrayList<Document>();
json.stream().map(obj -> (JSONObject)obj).forEach(item->result.add(jsonToDoc(item)));
return result;
} catch(Exception ex) {
return null;
}
}
public static JSONObject docToJson(Document doc) {
JsonWriterSettings settings = JsonWriterSettings.builder()
.int64Converter((value, writer) -> writer.writeNumber(value.toString()))
.doubleConverter((value, writer) -> writer.writeNumber(Long.toString(Math.round(value))))
.objectIdConverter((value, writer) -> writer.writeString(value.toHexString()))
.build();
return (JSONObject)JSONValue.parse(doc.toJson(settings));
}
public static JSONArray docToJsonArray(List<Document> docs) {
JSONArray array = new JSONArray();
for (Document doc : docs) {
array.add(docToJson(doc));
}
return array;
}
======== BigDecimal을 Document이용해 저장하는 경우 ============
- BigDecimal amount 몽고DB 저장 시
document.append("amount", new Decimal128(amount)));
- BigDecimal amount 몽고DB 읽기 시
amount = ((Decimal128) document.get("amount")).bigDecimalValue();
========vs. BigDecmial을 mongoTemplate을 이용해 저장하는 경우========
그냥 필드를 BigDecimal로 해 놓으면 자동으로 String처럼 변환되면서 mongoTemplate사용 가능할 것으로 예상.
안되면 https://stackoverflow.com/questions/37950296/spring-data-mongodb-bigdecimal-support참조.