From de995d2576fcb5b5984f592b80f6487d62bc4fb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD=D0=B4=D1=80=20?= =?UTF-8?q?=D0=9E=D1=80=D1=83=D0=B4=D0=B6=D0=B5=D0=B2?= Date: Fri, 22 Jan 2021 19:08:52 +0400 Subject: [PATCH] mongodb demo updated --- examples/mongo-db-demo-new-mongock/pom.xml | 7 ++ .../repositories/StudentRepositoryCustom.java | 2 + .../StudentRepositoryCustomImpl.java | 70 +++++++++++++++++++ .../utils/RawResultPrinterImpl.java | 19 ++++- .../StudentRepositoryWithListenersTest.java | 10 +++ .../src/test/resources/application.yml | 2 +- 6 files changed, 108 insertions(+), 2 deletions(-) diff --git a/examples/mongo-db-demo-new-mongock/pom.xml b/examples/mongo-db-demo-new-mongock/pom.xml index 5b1a80a8..dc078962 100644 --- a/examples/mongo-db-demo-new-mongock/pom.xml +++ b/examples/mongo-db-demo-new-mongock/pom.xml @@ -59,6 +59,13 @@ test + + com.google.code.gson + gson + 2.8.6 + + + org.junit.jupiter diff --git a/examples/mongo-db-demo-new-mongock/src/main/java/ru/otus/example/mongodbdemo/repositories/StudentRepositoryCustom.java b/examples/mongo-db-demo-new-mongock/src/main/java/ru/otus/example/mongodbdemo/repositories/StudentRepositoryCustom.java index 8b902bbf..3dcf9c92 100644 --- a/examples/mongo-db-demo-new-mongock/src/main/java/ru/otus/example/mongodbdemo/repositories/StudentRepositoryCustom.java +++ b/examples/mongo-db-demo-new-mongock/src/main/java/ru/otus/example/mongodbdemo/repositories/StudentRepositoryCustom.java @@ -9,4 +9,6 @@ public interface StudentRepositoryCustom { long getExperienceArrayLengthByStudentId(String id); void removeExperienceArrayElementsById(String id); + + void printGetStudentExperienceByIdAggregationResultForStage(String studentId, int stage); } diff --git a/examples/mongo-db-demo-new-mongock/src/main/java/ru/otus/example/mongodbdemo/repositories/StudentRepositoryCustomImpl.java b/examples/mongo-db-demo-new-mongock/src/main/java/ru/otus/example/mongodbdemo/repositories/StudentRepositoryCustomImpl.java index 317ff9b2..93b6bade 100644 --- a/examples/mongo-db-demo-new-mongock/src/main/java/ru/otus/example/mongodbdemo/repositories/StudentRepositoryCustomImpl.java +++ b/examples/mongo-db-demo-new-mongock/src/main/java/ru/otus/example/mongodbdemo/repositories/StudentRepositoryCustomImpl.java @@ -7,6 +7,7 @@ import org.bson.Document; import org.bson.types.ObjectId; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.aggregation.Aggregation; +import org.springframework.data.mongodb.core.aggregation.AggregationOperation; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Update; @@ -41,6 +42,7 @@ public class StudentRepositoryCustomImpl implements StudentRepositoryCustom { , project().and("experience_map").arrayElementAt(1).as("experience_id_map") , project().and("experience_id_map.v").as("experience_id") , lookup("knowledge", "experience_id", "_id", "experience") + , unwind("experience") , project().and("experience._id").as("_id").and("experience.name").as("name") ); @@ -67,4 +69,72 @@ public class StudentRepositoryCustomImpl implements StudentRepositoryCustom { mongoTemplate.updateMulti(new Query(), update, Student.class); } + @Override + public void printGetStudentExperienceByIdAggregationResultForStage(String studentId, int stage) { + System.out.printf("Stage: %d\n\n", stage); + + AggregationOperation[] operations = new AggregationOperation[]{ + unwind("experience") + , project().andExclude("_id").and(valueOfToArray("experience")).as("experience_map") + , project().and("experience_map").arrayElementAt(1).as("experience_id_map") + , project().and("experience_id_map.v").as("experience_id") + , lookup("knowledge", "experience_id", "_id", "experience") + , unwind("experience") + , project().and("experience._id").as("_id").and("experience.name").as("name") + }; + + String[] operationsAsStr = new String[]{ + "unwind(\"experience\")" + , "project().andExclude(\"_id\").and(valueOfToArray(\"experience\")).as(\"experience_map\")" + , "project().and(\"experience_map\").arrayElementAt(1).as(\"experience_id_map\")" + , "project().and(\"experience_id_map.v\").as(\"experience_id\")" + , "lookup(\"knowledge\", \"experience_id\", \"_id\", \"experience\")" + , "unwind(\"experience\")" + , "project().and(\"experience._id\").as(\"_id\").and(\"experience.name\").as(\"name\")" + }; + + Aggregation aggregation = newAggregation(match(Criteria.where("id").is(studentId))); + System.out.println("match(Criteria.where(\"id\").is(studentId)"); + for (int i = 1; i <= stage; i++) { + System.out.println(operationsAsStr[i - 1]); + aggregation.getPipeline().add(operations[i - 1]); + } + System.out.println(); + Document rawResults = mongoTemplate.aggregate(aggregation, Student.class, Knowledge.class).getRawResults(); + rawResultPrinter.prettyPrintRawResult(rawResults); + } +/* + @Override + public void printGetStudentExperienceByIdAggregationResultForStage(String studentId, int stage) { + System.out.printf("Stage: %d\n\n", stage); + + AggregationOperation[] operations = new AggregationOperation[]{ + unwind("experience") + , project().andExclude("_id").and(valueOfToArray("experience")).as("experience_map") + , project().and("experience_map").arrayElementAt(1).as("experience_id_map") + , project().and("experience_id_map.v").as("experience_id") + , lookup("knowledge", "experience_id", "_id", "experience") + , project().and("experience._id").as("_id").and("experience.name").as("name") + }; + + String[] operationsAsStr = new String[]{ + "unwind(\"experience\")" + , "project().andExclude(\"_id\").and(valueOfToArray(\"experience\")).as(\"experience_map\")" + , "project().and(\"experience_map\").arrayElementAt(1).as(\"experience_id_map\")" + , "project().and(\"experience_id_map.v\").as(\"experience_id\")" + , "lookup(\"knowledge\", \"experience_id\", \"_id\", \"experience\")" + , "project().and(\"experience._id\").as(\"_id\").and(\"experience.name\").as(\"name\")" + }; + + Aggregation aggregation = newAggregation(match(Criteria.where("id").is(studentId))); + System.out.println("match(Criteria.where(\"id\").is(studentId)"); + for (int i = 1; i <= stage; i++) { + System.out.println(operationsAsStr[i - 1]); + aggregation.getPipeline().add(operations[i - 1]); + } + System.out.println(); + Document rawResults = mongoTemplate.aggregate(aggregation, Student.class, Knowledge.class).getRawResults(); + rawResultPrinter.prettyPrintRawResult(rawResults); + } +*/ } diff --git a/examples/mongo-db-demo-new-mongock/src/main/java/ru/otus/example/mongodbdemo/utils/RawResultPrinterImpl.java b/examples/mongo-db-demo-new-mongock/src/main/java/ru/otus/example/mongodbdemo/utils/RawResultPrinterImpl.java index 1fcd9a7c..0603dcc2 100644 --- a/examples/mongo-db-demo-new-mongock/src/main/java/ru/otus/example/mongodbdemo/utils/RawResultPrinterImpl.java +++ b/examples/mongo-db-demo-new-mongock/src/main/java/ru/otus/example/mongodbdemo/utils/RawResultPrinterImpl.java @@ -1,8 +1,12 @@ package ru.otus.example.mongodbdemo.utils; +import com.google.gson.*; +import com.mongodb.DBRef; import org.bson.Document; +import org.bson.types.ObjectId; import org.springframework.stereotype.Component; +import java.lang.reflect.Type; import java.util.List; import java.util.stream.Collectors; @@ -12,7 +16,20 @@ public class RawResultPrinterImpl implements RawResultPrinter { @Override public void prettyPrintRawResult(Document document) { List results = (List) document.get("results"); - String resultsAsString = results.stream().map(Document::toString).collect(Collectors.joining("\n")); + Gson gson = new GsonBuilder() + .setPrettyPrinting() + .registerTypeAdapter(ObjectId.class, (JsonSerializer) (src, typeOfSrc, context) -> + new JsonPrimitive(src.toHexString())) + .registerTypeAdapter(DBRef.class, (JsonSerializer) (src, typeOfSrc, context) -> { + JsonObject jsonObject = new JsonObject(); + jsonObject.add("$ref", new JsonPrimitive(src.getCollectionName())); + jsonObject.add("$id", new JsonPrimitive(src.getId().toString())); + return jsonObject; + }) + .create(); + + String resultsAsString = gson.toJson(results); + //String resultsAsString = results.stream().map(Document::toString).collect(Collectors.joining("\n")); System.out.println(resultsAsString); } } diff --git a/examples/mongo-db-demo-new-mongock/src/test/java/ru/otus/example/mongodbdemo/repositories/withlisteners/StudentRepositoryWithListenersTest.java b/examples/mongo-db-demo-new-mongock/src/test/java/ru/otus/example/mongodbdemo/repositories/withlisteners/StudentRepositoryWithListenersTest.java index 44b17163..8041dbdd 100644 --- a/examples/mongo-db-demo-new-mongock/src/test/java/ru/otus/example/mongodbdemo/repositories/withlisteners/StudentRepositoryWithListenersTest.java +++ b/examples/mongo-db-demo-new-mongock/src/test/java/ru/otus/example/mongodbdemo/repositories/withlisteners/StudentRepositoryWithListenersTest.java @@ -41,4 +41,14 @@ class StudentRepositoryWithListenersTest extends AbstractRepositoryTest { assertThat(knowledgeList).containsExactlyInAnyOrderElementsOf(student.getExperience()); } + @DisplayName("напечатать все стадии агрегации для getStudentExperienceById") + @Test + void shouldPrintAggregationStagesForHetStudentExperienceByIdMethod (){ + val student = studentRepository.findAll().get(0); + for (int i = 0; i <= 7; i++) { + studentRepository.printGetStudentExperienceByIdAggregationResultForStage(student.getId(), i); + System.out.println("\n\n"); + } + } + } diff --git a/examples/mongo-db-demo-new-mongock/src/test/resources/application.yml b/examples/mongo-db-demo-new-mongock/src/test/resources/application.yml index b4992648..9a8e8307 100644 --- a/examples/mongo-db-demo-new-mongock/src/test/resources/application.yml +++ b/examples/mongo-db-demo-new-mongock/src/test/resources/application.yml @@ -3,7 +3,7 @@ spring: mongodb: port: 0 database: test - #uri: mongodb://localhost + #host: localhost #port: 27017 #database: awesomeMongo