2016-01-27 11 views
9

Ich mag eine Sammlung veröffentlichen, in denen Dokumente erzielt werden gemäß einer Kombination von ihren Feldern und dem vom Benutzer bestimmten Kontext; und das zurückgegebene Ergebnis wird basierend auf diesem Ergebnis sortiert und wahrscheinlich auf die besten Ergebnisse beschränkt.Meteor - veröffentlicht eine Sammlung auf personalisierte Punktzahl sortierte

This zeigt, wie zum Zeitpunkt der Veröffentlichung ein transform Filter zu einer Sammlung hinzugefügt wird. Ich bin mir aber nicht sicher transform ist ein effizienter Ansatz für die Berechnung eines Feldes, das ich in der Art verwenden möchte.

Schließlich wäre es toll, Mongo Map Reduce zu verwenden, um empfohlene Elemente auf der Grundlage der berechneten schnell zurückzukehren Partitur, die parallel gemacht werden kann.

@ brett-mclain pointed out wie einige Karten können reduzieren die Sortierung in reiner Mongo erfolgen. Es gibt ein paar Meteor Pakete out there zu Meteor Sammlungen zu erweitern, aber ich konnte nicht finden, wie sie in der Meteor Veröffentlichung zu verwenden (vs in einem Verfahren) Außerdem here die Karte Ausgabe reduzieren auf eine andere Sammlung senden, die scheinbar jedes Mal überschrieben wird, um die Methode wird aufgerufen.

ist hier etwa die Logik Ich mag würde erreichen:

/* Server */ 
Meteor.publish('getRecommendedItems', function() { 
    var u = Users.findOne(this.userId); 
    var scoreItem = function(item, u) { ... }; 
    return Items.find(
    {}, 
    { 
     transformInParallel: function(doc) { 
     doc.score = scoreItem(doc); 
     }, 
     sort: {score: -1}, 
     limit: 10, 
    } 
); 
}); 


/* Client template*/ 
Template.templateName.onCreated(function() { 
    this.subscribe('getRecommendedItems'); 
    this.items = Items.find({}, sort: {score: -1}); 
}); 

, wo ich außer score im Client zugegriffen werden kann, ohne dass eine Berechnung zu tun.

Es scheint einfacher, benutzerdefinierte Dinge in Meteor.methods zu tun, aber Meteor.publish fühlt sich an wie der natürliche Ort, um dies zu tun; weil hier die magische Reaktivität von Meteor stattfindet.

+0

Mögliche Duplikate von [Sortieren mongodb von reddit Ranking-Algorithmus] (http://StackOverflow.com/Questions/22728668/Sorting-Mongodb-by-reddit-ranking-algorithm) –

+1

Ich habe dies als ein Duplikat gekennzeichnet und verknüpft zu einer Stackoverflow-Frage über die Implementierung von Reddits Time-Decay-Algorithmus durch Sortierung in MongoDB. Ihre Lösung ist eine Karte verwenden reduzieren: http://stackoverflow.com/questions/22728668/sorting-mongodb-by-reddit-ranking-algorithm –

+0

Das ist ein sehr interessanter Beitrag. Ich frage mich, wie ich diese Mongo-Operationen innerhalb des Meteor-Rahmens durchführen kann. Mein Verständnis ist, dass Meteor eine Schicht hinzufügt, die Live-Updates für den Client bereitstellt, und anscheinend die Operation beschränkt, die man tun kann, um dieses Ergebnis zu erreichen. Aus einer Meteor-Sammlung gibt es Hinweise wie '.mapReduce' Lassen Sie mich wissen, wenn ich etwas vermisse, sonst werde ich bearbeiten und öffnen Sie die Frage – Guig

Antwort

0
transformInParallel: function(doc) { 
    doc.score = scoreItem(doc); 
    }, 
    sort: {score: -1}, 
    limit: 10, 

Dieses in einem Voll Datenbank-Scan führt.

Zeit Zerfall Lösungen, die Fragen tatsächlich gemeinsame Programmierung Test sind, sind nicht wirklich geeignet für Ihren Anwendungsfall.

Wenn Ihr Maßstab klein ist, precompute einfach eine ganze Reihe von

{score: ..., userId: ..., item: ...} 

Dokumenten in einer getrennten Sammlung. Die Indizes für eine Milliarde kleiner Dokumente wie diese passen vollständig in den Arbeitsspeicher eines einzelnen Datenbankservers. dies wird für höchstens z.B. 30.000 Artikel und 30.000 Benutzer.

Wenn sich Ihre Bedürfnisse diesen Wert überschreiten, müssen Sie darüber nachdenken, was die Berechnung Teil der Partitur kann zwischen Benutzern gemeinsam genutzt werden. Wenn kein Teil der Berechnung geteilt werden kann, sollten Sie lesen, wie Facebook soziale Grafiken in herkömmlichen Datenbanken implementiert.

Verwandte Themen