2016-11-24 3 views
0

Ich wurde damit beauftragt, ein existierendes (großes) node.js-Web mit mongoose zu modifizieren.Ist implizit implizit und wie viele Ebenen kann es gehen?

Das Schema hat eine Question die zu einem Array von Answer verknüpft wie folgt:

var QuestionSchema = mongoose.Schema({ 
    text: { type: String }, 
    ... 
    answers: [{type: mongoose.Schema.Types.ObjectId, ref: 'Answer'}], 
    ... 
}); 

var AnswerSchema = mongoose.Schema({ 
    text: { type: String }, 
    .... 
    question: { 
     type: mongoose.Schema.ObjectId, 
     ref: Question 
    }, 
... 
});  
var Question = mongoose.model('Story', QuestionSchema); 
var Answer = mongoose.model('Answer', AnswerSchema); 

I keine Instanz der populate Methode in dem Code verwendet wird, lokalisieren können, aber eine Abfrage eines Dokuments Question immer mit dem Array voller answer Objekte zurück, nicht nur die Objekt-ID. Das ist was benötigt wird.

Ich muss jetzt ein Array von reaction Objekte zu answer hinzufügen. Früher habe ich die folgenden:

var Answer = mongoose.model('Answer', AnswerSchema); 
var ReactionSchema = mongoose.Schema({ 
    text: { type: String }, 
    .... 
    answer: { 
     type: mongoose.Schema.ObjectId, 
     ref: Answer, 
     //required: true 
    }, 
    ... 
}); 

ich dann folgendes zum Answer Schema hinzugefügt:

reactions: [{type: mongoose.Schema.Types.ObjectId, ref: 'Reaction'}] 
//where var Reaction = mongoose.model('Reaction', ReactionSchema); 

Ich bin in der Lage reaction Objekte zu speichern, und wenn ich die Datenbankinhalte von answer inspiziert, die reaction Objekte sind in Art und Form gleich answer Objekte in question.

Wenn jedoch ein question Dokument zurückgegeben wird, jedes Element von answer.reaction enthält nur die Objekt-ID von reaction anstelle des vollständigen reaction Objekts. Was habe ich weggelassen oder wie mache ich die Abfrage, um den Join basierend auf dem ref Typ durchzuführen?

Die Mongodb-Version ist 3.2.9, und Mungo ist 4.0.4.

Antwort

0

Wie fragen Sie eine Frage ab? Dies ist, wie Sie verschachtelte Referenzen auflösen können:

Question.findById(id).populate({ 
    path: 'answer', 
    model: 'Answer', 
    populate: { 
    path: 'reaction', 
    model: 'Reaction' 
    } 
}).exec(function(err, data){}); 

Hier der Link zu dem Mungo docs ist: Mongoose Docs Deep Populate

+0

Dank. Ihre Antwort gab mir den Schlüssel zur Lösung des Problems. Meine Version von Mongo hat überhaupt keine Populate-Methode. Ich verbrachte mehr Zeit damit, in den vorhandenen Code zu graben und fand schließlich den Code, der die "Antwort" -Objekte von den Objekt-IDs, die in "Frage.Antworten" gespeichert waren, manuell abrief und sie dann dem Fragendokument hinzufügte, das zurückgegeben wurde. –