diff --git a/examples/mongo-db-demo/pom.xml b/examples/mongo-db-demo/pom.xml
index 471f134e..f86c68d6 100644
--- a/examples/mongo-db-demo/pom.xml
+++ b/examples/mongo-db-demo/pom.xml
@@ -5,7 +5,7 @@
org.springframework.boot
spring-boot-starter-parent
- 2.1.3.RELEASE
+ 2.1.8.RELEASE
ru.otus.example
@@ -15,9 +15,9 @@
Demo project for MongoDB
- 1.8
- 1.8.
- 1.8
+ 11
+ 11
+ 11
diff --git a/examples/mongo-db-demo/src/main/java/ru/otus/example/mongodbdemo/changelogs/InitMongoDBDataChangeLog.java b/examples/mongo-db-demo/src/main/java/ru/otus/example/mongodbdemo/changelogs/InitMongoDBDataChangeLog.java
index b36b0046..c71c7515 100644
--- a/examples/mongo-db-demo/src/main/java/ru/otus/example/mongodbdemo/changelogs/InitMongoDBDataChangeLog.java
+++ b/examples/mongo-db-demo/src/main/java/ru/otus/example/mongodbdemo/changelogs/InitMongoDBDataChangeLog.java
@@ -30,8 +30,7 @@ public class InitMongoDBDataChangeLog {
@ChangeSet(order = "002", id = "initStudents", author = "stvort", runAlways = true)
public void initStudents(MongoTemplate template){
- val student = new Student("Student #1", springDataKnowledge, mongockKnowledge);
- template.save(student);
+ template.save(new Student("Student #1", springDataKnowledge, mongockKnowledge));
}
@ChangeSet(order = "003", id = "Teacher", author = "stvort", runAlways = true)
diff --git a/examples/mongo-db-demo/src/main/java/ru/otus/example/mongodbdemo/repositories/StudentRepositoryCustom.java b/examples/mongo-db-demo/src/main/java/ru/otus/example/mongodbdemo/repositories/StudentRepositoryCustom.java
index 027eec09..8b902bbf 100644
--- a/examples/mongo-db-demo/src/main/java/ru/otus/example/mongodbdemo/repositories/StudentRepositoryCustom.java
+++ b/examples/mongo-db-demo/src/main/java/ru/otus/example/mongodbdemo/repositories/StudentRepositoryCustom.java
@@ -1,6 +1,12 @@
package ru.otus.example.mongodbdemo.repositories;
+import ru.otus.example.mongodbdemo.model.Knowledge;
+
+import java.util.List;
+
public interface StudentRepositoryCustom {
+ List getStudentExperienceById(String studentId);
+
long getExperienceArrayLengthByStudentId(String id);
void removeExperienceArrayElementsById(String id);
}
diff --git a/examples/mongo-db-demo/src/main/java/ru/otus/example/mongodbdemo/repositories/StudentRepositoryCustomImpl.java b/examples/mongo-db-demo/src/main/java/ru/otus/example/mongodbdemo/repositories/StudentRepositoryCustomImpl.java
index 8d734a09..91fb3536 100644
--- a/examples/mongo-db-demo/src/main/java/ru/otus/example/mongodbdemo/repositories/StudentRepositoryCustomImpl.java
+++ b/examples/mongo-db-demo/src/main/java/ru/otus/example/mongodbdemo/repositories/StudentRepositoryCustomImpl.java
@@ -3,15 +3,22 @@ package ru.otus.example.mongodbdemo.repositories;
import lombok.Data;
import lombok.RequiredArgsConstructor;
import lombok.val;
+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.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
+import ru.otus.example.mongodbdemo.model.Knowledge;
import ru.otus.example.mongodbdemo.model.Student;
+import ru.otus.example.mongodbdemo.utils.RawResultPrinter;
+import java.util.List;
+
+import static org.springframework.data.mongodb.core.aggregation.Aggregation.*;
+import static org.springframework.data.mongodb.core.aggregation.ObjectOperators.ObjectToArray.valueOfToArray;
import static org.springframework.data.mongodb.core.query.Criteria.where;
@RequiredArgsConstructor
@@ -23,16 +30,36 @@ public class StudentRepositoryCustomImpl implements StudentRepositoryCustom {
}
private final MongoTemplate mongoTemplate;
+ private final RawResultPrinter rawResultPrinter;
- public long getExperienceArrayLengthByStudentId(String id) {
+ @Override
+ public List getStudentExperienceById(String studentId) {
+ Aggregation aggregation = newAggregation(
+ match(Criteria.where("id").is(studentId))
+ , 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")
+ );
+
+ Document rawResults = mongoTemplate.aggregate(aggregation, Student.class, Knowledge.class).getRawResults();
+ rawResultPrinter.prettyPrintRawResult(rawResults);
+ return mongoTemplate.aggregate(aggregation, Student.class, Knowledge.class).getMappedResults();
+ }
+
+ @Override
+ public long getExperienceArrayLengthByStudentId(String studentId) {
val aggregation = Aggregation.newAggregation(
- Aggregation.match(where("id").is(id)),
- Aggregation.project().andExclude("_id").and("experience").size().as("size"));
+ match(where("id").is(studentId)),
+ project().andExclude("_id").and("experience").size().as("size"));
val arraySizeProjection = mongoTemplate.aggregate(aggregation, Student.class, ArraySizeProjection.class).getUniqueMappedResult();
return arraySizeProjection == null ? 0 : arraySizeProjection.getSize();
}
+ @Override
public void removeExperienceArrayElementsById(String id) {
val query = Query.query(Criteria.where("$id").is(new ObjectId(id)));
val update = new Update().pull("experience", query);
diff --git a/examples/mongo-db-demo/src/main/java/ru/otus/example/mongodbdemo/utils/RawResultPrinter.java b/examples/mongo-db-demo/src/main/java/ru/otus/example/mongodbdemo/utils/RawResultPrinter.java
new file mode 100644
index 00000000..e033d42d
--- /dev/null
+++ b/examples/mongo-db-demo/src/main/java/ru/otus/example/mongodbdemo/utils/RawResultPrinter.java
@@ -0,0 +1,8 @@
+package ru.otus.example.mongodbdemo.utils;
+
+import org.bson.Document;
+
+public interface RawResultPrinter {
+ @SuppressWarnings("unchecked")
+ void prettyPrintRawResult(Document document);
+}
diff --git a/examples/mongo-db-demo/src/main/java/ru/otus/example/mongodbdemo/utils/RawResultPrinterImpl.java b/examples/mongo-db-demo/src/main/java/ru/otus/example/mongodbdemo/utils/RawResultPrinterImpl.java
new file mode 100644
index 00000000..1fcd9a7c
--- /dev/null
+++ b/examples/mongo-db-demo/src/main/java/ru/otus/example/mongodbdemo/utils/RawResultPrinterImpl.java
@@ -0,0 +1,18 @@
+package ru.otus.example.mongodbdemo.utils;
+
+import org.bson.Document;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Component
+public class RawResultPrinterImpl implements RawResultPrinter {
+ @SuppressWarnings("unchecked")
+ @Override
+ public void prettyPrintRawResult(Document document) {
+ List results = (List) document.get("results");
+ String resultsAsString = results.stream().map(Document::toString).collect(Collectors.joining("\n"));
+ System.out.println(resultsAsString);
+ }
+}
diff --git a/examples/mongo-db-demo/src/main/resources/application.yml b/examples/mongo-db-demo/src/main/resources/application.yml
index 6f2c5b5a..4d338124 100644
--- a/examples/mongo-db-demo/src/main/resources/application.yml
+++ b/examples/mongo-db-demo/src/main/resources/application.yml
@@ -4,3 +4,6 @@ spring:
uri: mongodb://localhost
port: 27017
database: awesomeMongo
+logging:
+ level:
+ root: ERROR
\ No newline at end of file
diff --git a/examples/mongo-db-demo/src/test/java/ru/otus/example/mongodbdemo/repositories/AbstractRepositoryTest.java b/examples/mongo-db-demo/src/test/java/ru/otus/example/mongodbdemo/repositories/AbstractRepositoryTest.java
index e3723a05..f1342168 100644
--- a/examples/mongo-db-demo/src/test/java/ru/otus/example/mongodbdemo/repositories/AbstractRepositoryTest.java
+++ b/examples/mongo-db-demo/src/test/java/ru/otus/example/mongodbdemo/repositories/AbstractRepositoryTest.java
@@ -3,11 +3,12 @@ package ru.otus.example.mongodbdemo.repositories;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTest;
import org.springframework.context.annotation.ComponentScan;
-import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.context.annotation.Import;
+import ru.otus.example.mongodbdemo.utils.RawResultPrinterImpl;
@DataMongoTest
@EnableConfigurationProperties
@ComponentScan({"ru.otus.example.mongodbdemo.config", "ru.otus.example.mongodbdemo.repositories"})
-@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
+@Import(RawResultPrinterImpl.class)
public abstract class AbstractRepositoryTest {
}
diff --git a/examples/mongo-db-demo/src/test/java/ru/otus/example/mongodbdemo/repositories/withlisteners/StudentRepositoryWithListenersTest.java b/examples/mongo-db-demo/src/test/java/ru/otus/example/mongodbdemo/repositories/withlisteners/StudentRepositoryWithListenersTest.java
index 94533d52..f70740c8 100644
--- a/examples/mongo-db-demo/src/test/java/ru/otus/example/mongodbdemo/repositories/withlisteners/StudentRepositoryWithListenersTest.java
+++ b/examples/mongo-db-demo/src/test/java/ru/otus/example/mongodbdemo/repositories/withlisteners/StudentRepositoryWithListenersTest.java
@@ -10,6 +10,8 @@ import ru.otus.example.mongodbdemo.model.Student;
import ru.otus.example.mongodbdemo.repositories.AbstractRepositoryTest;
import ru.otus.example.mongodbdemo.repositories.StudentRepository;
+import java.util.List;
+
import static org.assertj.core.api.Assertions.assertThat;
@DisplayName("StudentRepository при наличии listener-ов в контексте ")
@@ -28,4 +30,12 @@ class StudentRepositoryWithListenersTest extends AbstractRepositoryTest {
assertThat(actual.getName()).isEqualTo(student.getName());
}
+ @DisplayName("должен возвращать корректный список знаний студента")
+ @Test
+ void shouldReturnCorrectStudentKnowledgeList(){
+ val student = studentRepository.findAll().get(0);
+ List knowledgeList = studentRepository.getStudentExperienceById(student.getId());
+ assertThat(knowledgeList).containsExactlyInAnyOrderElementsOf(student.getExperience());
+ }
+
}
diff --git a/examples/mongo-db-demo/src/test/resources/application.yml b/examples/mongo-db-demo/src/test/resources/application.yml
index 8b39c9df..e4a55735 100644
--- a/examples/mongo-db-demo/src/test/resources/application.yml
+++ b/examples/mongo-db-demo/src/test/resources/application.yml
@@ -5,4 +5,7 @@ spring:
database: test
#uri: mongodb://localhost
#port: 27017
- #database: awesomeMongo
\ No newline at end of file
+ #database: awesomeMongo
+logging:
+ level:
+ root: ERROR
\ No newline at end of file