Lassen Sie uns sagen, dass ich diese zwei Dokumente haben:Spring Data MongoDB - Finden Alle verschachtelten Objekten
@Document
public class Exam {
private int examId;
private List<Question> questions;
und
public class Question {
private int questionId;
private String question;
Ich brauche einen ‚findAll‘ zu schreiben, die eine Liste aller Fragen zurück (oder idealerweise nur "Frage" -String im Frageobjekt) für ein bestimmtes 'Exam' -Objekt (examId == n) mit MongoRepository oder anders in Java mit Spring Data MongoDb, wie mache ich das?
MatchOperation match = match(new Criteria("examId").is(1));
UnwindOperation unwind = unwind("questions");
ProjectionOperation project = project().andExclude("_id").and("questions.question").as("question");
Aggregation aggregation = newAggregation(match, unwind, project);
AggregationResults<DBObject> result = mongoOperations.aggregate(aggregation, "exams", DBObject.class);
result.forEach(new Consumer<DBObject>() {
@Override
public void accept(DBObject t) {
System.out.println(t.toString());
}
});
// otuput
// { "question" : "xyz"}
// { "question" : "abc"}
Das Ergebnis abgebildet wird hier DBObject Sie können jedoch geeignetere Klasse definieren:
{
"_id" : ObjectId("xyz"),
"_class" : "com.xxx.Exam",
"examId" : 1,
"questions" : [
{"questionId" : 1, "question" : "xyz" },
{"questionId" : 2, "question" : "abc" }
]
}
können Sie bieten Sammlungen Struktur – Jain
Ihre Modellierung ist fraglich. Mit MongoDB verwenden Sie normalerweise keinen Join; Stattdessen betten Sie Ihre Frage in die Prüfung ein. Dann hol dir einfach die Prüfung. – chrylis
Entschuldigung. Frage ist kein anderes Dokument. Nur ein eingebettetes Objekt. – DilTeam