2016-08-12 3 views
0

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" } 
    ] 
} 
+0

können Sie bieten Sammlungen Struktur – Jain

+0

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

+0

Entschuldigung. Frage ist kein anderes Dokument. Nur ein eingebettetes Objekt. – DilTeam

Antwort

0

Es gibt mehr als einen Weg, das zu tun, einer von ihnen so sein könnte.

+0

Woher kommt project()? – DilTeam

+0

[Projekt()] (https://docs.mongodb.com/manual/reference/operator/aggregation/project/) ist eine Stufe in der Aggregationspipeline, es ist in der Abfrage, die verschachtelten "questions.question" zu glätten Unterlagen. –

Verwandte Themen