2015-07-11 1 views
5

Meteor unterstützt nur wenige Methoden auf Mongo-Sammlungen wie finden, findOne, einfügen, aktualisieren, upsert, entfernen, erlauben, verweigern Meine Frage ist, wie mache ich alle anderen? Ich möchte auf Server-Seite Aggregat verwenden, wie folgt aus:Wie man native Mongo-Methoden in der Meteor App-Umgebung ausführt?

db.eshops.aggregate([ 
    { 
    $unwind: '$unpairedCategories' 
    }, { 
    $group: { 
     _id: '$_id', 
     'sum': { 
     $sum: 1 
     } 
    } 
    }, { 
    $group: { 
     _id: null, 
     total_sum: { 
     '$sum': '$sum' 
     } 
    } 
    } 
]); 

sollte ich mongodb Treiber für NodeJS getrennt von Meteor enthalten? Oder was ist der Meteor-Weg, um alle anderen Mongo-Sammlungsmethoden zu betreiben?

+0

Ich fand, dass ich leicht Mongo Aggregat mit meteorhacks verwenden können: Gesamtpaket https://github.com/meteorhacks/meteor-aggregate/ –

+0

FYI dieses Paket wird mit 'cursor.observe', die zweite Alternative, die ich erwähnt habe. Ich habe bemerkt, dass du die Antwort nicht validiert hast. Bitte tun Sie, wenn Sie es für richtig/hilfreich halten. – Billybobbonnet

Antwort

2

Einer the seven principles of Meteor ist Datenbank überall, das heißt Sie in der Lage sein sollten, alle zulässigen Operationen sowohl auf Client- und Server-Seite (unter der Annahme einige Unterschiede, wie allow deny Regeln für Client) durchzuführen. Ich denke, das ist der Grund, warum Sie nicht alle Mongo-Methoden haben können: Sie sind nicht möglich auf Minimongo, der Client-Seite Version Ihrer Mongo-Sammlung.

Wenn Sie jedoch sind bereit, um die Reaktivität aufgeben, können Sie ein Rohr erstellen können die aggregate Befehle zu handhaben, indem Sie diesen auf Ihren Server-Startcode (code taken from here):

wrapAsync = (Meteor.wrapAsync)? Meteor.wrapAsync : Meteor._wrapAsync; 
Mongo.Collection.prototype.aggregate = function(pipelines) { 
    var coll; 
    if (this.rawCollection) { 
    // >= Meteor 1.0.4 
    coll = this.rawCollection(); 
    } else { 
    // < Meteor 1.0.4 
    coll = this._getCollection(); 
    } 
    return wrapAsync(coll.aggregate.bind(coll))(pipelines); 

Sie haben zwei mögliche Alternativen/Workaround, wenn Sie die Reaktivität behalten möchten.

  1. schaffen zusätzliche Felder usingcollection hooks. Sie enthalten grundsätzlich die berechneten Felder in der Sammlung. Dies ist eine skalierbare Lösung, und es ist nicht erforderlich, dem Server eine zusätzliche Last hinzuzufügen
  2. Sie verwenden die cursor.Observe() Funktion und Sie machen eine Mischung aus cleveren Filterung und benutzerdefinierten JS-Methoden (zB Summe), um ähnliche Ergebnisse zu erzielen, was Sie brauchen von der aggregate Methode. Beachten Sie, dass Sie die Reaktivität behalten, aber jeder Server (wenn Sie auf mehrere skalieren möchten) muss Observe() die Sammlungen. Überprüfen Sie folgendes Beispiel: https://stackoverflow.com/a/30813050/3793161
Verwandte Themen