2017-12-06 3 views
0

Mein Meteor Client empfängt Daten vom Server und speichert sie in minimongo. Diese Daten werden während der Sitzung garantiert nicht geändert, daher benötige ich Meteor nicht. Die statischen Daten kommen gerade auf diesem Weg an; nehmen wir das als gegeben hin.JavaScript Objekt vs Minimongo Effizienz

Die Daten sieht wie folgt aus:

{_id: 'abc...', val: {...}} 

Auf dem Client ist es effizienter, für mich Werte suchen mit:

val_I_need = Collection.findOne({id}) 

oder ein JavaScript-Objekt zu erstellen:

data = {} 
Collection.find().fetch().map((x) => {data[x._id] = x.val}) 

und für Looks verwenden:

Gibt es einen Wendepunkt, entweder in Bezug auf die Größe der Daten oder die Anzahl der Nachschlagevorgänge, wo sich die effizientere Methode ändert oder die anfänglichen Kosten für den Bau des Objekts überwiegt?

Antwort

1

FindOne kann effizienter auf größere Datensätze sein, weil es mit Cursor schaut nach oben, wo _id ein indizierte Schlüssel ist, während die find().fetch() Ansatz, der alle Dokumente erhalten erfordert und dann durch Mapping manuell durchlaufen.

Beachten Sie, dass findOne auch durch .find({_id:desiredId}).fetch()[0] ersetzt werden kann (vorausgesetzt, es gibt das gewünschte Dokument zurück).

Mehr dazu in der mongo documentation on query performance.

Allerdings, wenn es nur ein Objekt handelt, das später nicht reaktiv verfolgt wird, würde ich eher es laden über ein „FindOne“ -returning Verfahren vom Server:

export const getOne = new ValidatedMethod({ 
    name: "getOne", 
    validate(query) { 
     // validate query schema 
     // ... 
    }, 
    run(query) { 

     // CHECK PERMISSIONS 
     // ... 

     return MyCollection.findOne(query); 
}); 

Dies vermeidet Veröffentlichungen/Abonnements mit und also minimongo für diese Sammlung auf der aktuellen Client-Vorlage. Denken Sie daran, dass Pub/Sub bereits eine gewisse Reaktivität initialisiert hat, um die Sammlung zu beobachten und damit irgendwo eine Berechnung auffressen.

0

Mein Bauchgefühl ist, dass Sie niemals einen Punkt erreichen werden, an dem der Leistungsgewinn beim Einfügen in ein Objekt einen spürbaren Unterschied macht.

Es ist wahrscheinlicher, dass Ihr Engpass im Pub/Sub-Mechanismus liegt, da es eine Weile dauern kann, alle Dokumente an den Client zu senden.

Sie werden einen viel wahrnehmbaren Unterschied für einen großen Datensatz feststellen, wenn Sie die Daten mit einer Meteor-Methode abrufen.

An diesem Punkt haben Sie es in einem einfachen alten Javascript-Objekt sowieso und so am Ende mit dem kleinen Leistungsgewinn von nativen Objekt-Lookups auch.