2016-08-04 5 views
1

ich zwei getrennte Sammlungen haben, Patients und Invoices:Meteor/Mongo - Wie eine Abfrage zu schreiben, Daten aus einem separaten Datenkontext zu erhalten

Patients Collection 

{ 
    first_name: ... 
    surname: ... 
    ... 
} 


Invoices Collection: 

{ 
    invoice_no: ... 
    patient_id: ... 
    ... 
} 

Ich möchte eine Tabelle anzuzeigen, die zeigt alle Rechnungen . Unter den Spalten möchte ich dem Patienten zeigen, dass die Rechnung verwandt ist (ich habe die patient_id als eines der Felder in der Invoices Sammlung). So

Ich habe diese Helfer:

Template.showInvoices.helpers({ 
    invoices: function() { 
    return Invoices.find(); // i know this isn't ideal. 
    } 
}); 

Und das ist die Vorlage:

<template name="showInvoices"> 
    {{#each invoices}} 
    <tr> 
     <td>{{invoice_no}}</td> 
     <td> [PATIENT NAME] </td> 
    </tr> 
    {{/each}} 
</template> 

Wie kann ich den Namen des Patienten erhalten innerhalb der Rechnungen Datenkontext? Da ich aus MySQL und relationalen Datenbanken komme, kann ich nicht umhin, mich zu fragen, ob dies das richtige Design für meinen speziellen Fall ist, weil ich nicht ganz sicher bin, wie ich diese Abfrage durchführen soll. Sollte ich nur mein Design ändern?

Antwort

1

Sie können die optionale Umwandlungsfunktion transform nutzen, die verfügbar ist, wenn Sie eine Sammlung definieren. Die Transformationsoption ist eine Funktion, die das Dokument als Parameter akzeptiert und geändert werden kann. Die Dokumente werden durch diese Funktion übergeben werden, bevor von fetch oder findOne zurückgegeben werden, und vor map von observe, um Rückrufe übergeben wird, forEach, allow und deny damit dies ermöglicht es Ihnen, Daten von einem anderen collecion einzubetten auch zu einem verbinden.

Zum Beispiel, wenn Sie Ihre Meteor App Refactoring, können Sie Ihre Invoices Sammlung neu zu definieren, wie folgt:

Invoices = new Mongo.Collection('invoices', { 
    transform: function(doc) { 
     doc.patient = Patients.findOne(doc.patient_id); 
     return doc; 
    } 
}); 

Wenn Sie jetzt Invoices.find().fetch() in Ihrem Helfer rufen, haben Sie Zugriff auf die patient Eigenschaft haben, die a Patient Dokument:

Template.showInvoices.helpers({ 
    invoices: function() { 
     return Invoices.find().fetch(); 
    } 
}); 

Vorlage:

<template name="showInvoices"> 
    {{#each invoices}} 
     <tr> 
      <td>{{invoice_no}}</td> 
      <td>{{patient.first_name}}</td> 
     </tr> 
    {{/each}} 
</template> 
Verwandte Themen