2013-07-17 6 views
6

Auf meinem Meteorprojekt können Benutzer Ereignisse veröffentlichen und sie müssen (über eine automatische Vervollständigung) wählen, in welcher Stadt sie stattfindet. Ich habe eine vollständige Liste der französischen Städte und es wird nie aktualisiert werden.Gibt es eine Möglichkeit, dem Meteor zu sagen, dass eine Sammlung statisch ist (wird sich nie ändern)?

Ich möchte eine Sammlung und Publish-Subskribenten basierend auf der Eingabe der Autocomplete verwenden, weil ich nicht möchte, dass der Client die vollständige Datenbank (5 MB) herunterladen. Gibt es einen Weg für die Leistung, dem Meteor zu sagen, dass diese Sammlung "statisch" ist? Oder macht es keinen Unterschied?

Kann jemand einen anderen Ansatz vorschlagen?

Antwort

7

Wenn Sie „den Server anweisen wollen, dass eine Sammlung statisch ist“, ich bin mir dessen bewusst zwei mögliche Optimierungen:

  1. Sie die Datenbank mit einer Live-Abfrage nicht beobachten, weil die Daten niemals
  2. ändern
  3. Sie die Ergebnisse dieser Abfrage im merge box nicht speichern, weil sie verfolgt und mit anderen Daten (speichern Speicher und CPU)

(1) ist etwas verglichen werden nicht müssen Sie ziemlich leicht tun können indem Sie Ihren eigenen Veröffentlichungscursor erstellen. Wenn jedoch ein Client dieselbe Abfrage beobachtet, glaube ich, dass Meteor (zumindest in Zukunft) dafür optimiert wird, so dass es immer noch nur eine Live-Abfrage für eine beliebige Anzahl von Clients gibt. Was (2) angeht, ist mir keine direkte Möglichkeit bekannt, dies zu tun, da dies möglicherweise die Daten verschmelzen könnte, die über multiple publications and subscriptions zusammengeführt werden.

Um eine Live-Abfrage zu vermeiden, können Sie der Veröffentlichungsfunktion manuell Daten hinzufügen, anstatt einen Cursor zurückzugeben. Dadurch wird die .observe()-Funktion aufgerufen, um Daten mit dem Abonnement zu verbinden. Hier ist ein einfaches Beispiel:

Meteor.publish(function() { 
    var sub = this; 
    var args = {}; // what you're find()ing 

    Foo.find(args).forEach(function(document) { 
     sub.added("client_collection_name", document._id, document); 
    }); 

    sub.ready(); 
}); 

Dies bewirkt, dass die Daten an client_collection_name auf der Client-Seite hinzugefügt werden, die die gleichen Namen wie die Sammlung von Foo, oder etwas anderes verwiesen haben könnte. Beachten Sie, dass Sie many other things with publications tun können

UPDATE (auch, siehe Link oben.): zu beheben Probleme aus (2), die potentiell sehr problematisch sein kann, abhängig von der Größe der Sammlung, ist es notwendig, in dem Bypass Meteor insgesamt. Eine Möglichkeit dazu finden Sie unter https://stackoverflow.com/a/21835534/586086. Eine andere Möglichkeit besteht darin, einfach die Sammlung fetch() ed als Methodenaufruf zurückzugeben, obwohl dies nicht die Vorteile der Komprimierung bietet.

+1

Diese bis # 2 die akzeptierte Antwort sein sollte aufgelöst werden kann. Dank Andrew –

+1

@WesJohnson sehen http://stackoverflow.com/a/21835534/586086 für wie 2 # lösen. Ich werde diese Antwort auch irgendwann aktualisieren. –

3

Von Meteor doc: "Jede Änderung an der Sammlung, die die Dokumente in einem Cursor ändert, löst eine Neuberechnung aus. Um dieses Verhalten zu deaktivieren, übergeben Sie {reactive: false} als eine Option zum Suchen."

denke ich, diese einfache Option Antwort die beste

ist
+0

'reaktiv: false' funktioniert nur clientseitige. –

0

Sie brauchen nicht Ihre gesamte Sammlung zu veröffentlichen.
1. Zeigen Sie die Optionen für die automatische Vervollständigung erst an, nachdem der Benutzer die ersten drei Buchstaben eingegeben hat. Dadurch wird die Suche erheblich eingeschränkt.
2.Provide nicht mehr als 5-10 Städte als Optionen - dies wird Ihr Recordset wirklich klein halten - also keine Notwendigkeit, 5 MB Daten an jeden Benutzer zu schieben.
Ihre Publikation sollte wie folgt aussehen:

Meteor.publish('pub-name', function(userInput){ 
    var firstLetters = new RegExp('^' + userInput); 
    return Cities.find({name:firstLetters},{limit:10,sort:{name:1}}); 
}); 
Verwandte Themen