2016-05-25 17 views
0

Ich habe die Sammlung „Menü“ mit der Struktur:Meteor: Interner Serverfehler [500] mit Meteor.methods()

{ 
"_id" : "vJQr7EuieDHMuX2nx" "section" : "vine" "price" : "200" "category" : "bar" 
"_id" : "vJQr7EuieDHMuX4rf" "section" : "beer" "price" : "200" "category" : "kitchen" 
"_id" : "vJQr7EuieDHMuX5tg" "section" : "milk" "price" : "200" "category" : "kbar" 
"_id" : "vJQr7EuieDHMuX4sc" "section" : "beer" "price" : "200" "category" : "kitchen" 
"_id" : "vJQr7EuieDHMuX2xs" "section" : "vine" "price" : "200" "category" : "bar" 
} 

ich den Benutzer angezeigt werden sollen nur „Abschnitt“ ohne Zu diesem ich Wiederholung verwendet Menu.aggregate ([{$ group: {_ id: "$ section"}}]) aber es funktioniert nicht Wie kann ich das tun? Kann es sein, eine andere Methode zu verwenden?

Seite Server:

Meteor.methods({ 
    'getSections': function() { 
    var pipeline = [{$group:{_id:"$section"}}]; 
    var result = Menu.aggregate(pipeline); 
    var sections = []; 
    for (i = 0; i < result.length; i++) { 
     sections.push(result[i]._id); 
    }; 
    console.log(sections); 
    return sections; 
    } 
}); 

Ergebnis in dem Server: [ 'Rebe', 'Bier', 'Milch']

Kunde:

Template.MobBarMenu.helpers({ 
     'list': function(){ 
      this.render('MobBarMenu', {}); 
     }, 
     'listSections': function() { 
      Meteor.call('getSections', function (err, data) { 
       console.log(data); 
       // return data; 
      }); 
     } 
    }); 

template name="MobBarMenu" 
      {{#each listSections}} 
       {{this}} 
      {{/each}} 
template 

ich nicht wissen, wo die Lösung zu finden ist

+0

Ihre Serverkonsole sollte eine Fehlermeldung, die auf den tatsächlichen Fehler hinweist. Sie können auch 'meteor debug' verwenden, um Ihren serverseitigen Code zu debuggen. –

Antwort

0

Sie möchten wahrscheinlich eine erweiterte Publikation. Fügen Sie in Ihrem Vorlagencode eine benannte Auflistung hinzu (nur auf dem Client). Dann können Sie einen Helfer erstellen, um die Daten zu erhalten und die Publikation zu abonnieren.

const Sections = new Mongo.Collection('sections'); 
Template.Menu.onCreated(function() { 
    this.subscribe('sections') 
}) 
Template.Menu.helpers({ 
    sections() { 
    return Sections.find(); 
    } 
}); 

Dann erstellen Sie eine Publikation, die dazu schreibt.

Meteor.publish('sections', function() { 
    const handle = Menu.find({}, { 
    fields: { 
     _id: 0 
     section: 1 
    } 
    }).observe({ 
    added: doc => this.added('sections', doc.section, doc), 
    changed: doc => this.changed('sections', doc.section, doc), 
    removed: doc => this.removed('sections', doc.section, doc) 
    }); 
    this.ready(); 
    this.onStop(() => handle.stop()) 
}) 
0

Meteor verwendet MiniMongo - es ist ein eigener Wrapper von nodejs MongoDB-Treiber.

Und standardmäßig hat Collecions keine Methode aggregate. Sie können es in einigen Paketen finden, wie monbro:mongodb-mapreduce-aggregation.

Oder (die besser imo) Sie haben Zugriff auf Raw-Kollektion mit nativer bekommen kann Meteor rawCollection Methode:

Menu.rawCollection().aggregate(pipeline, function(err, res) { 
    //do stuff here 
}) 
Verwandte Themen