Da das Ranking ein berechneter Wert ist, der von der Zeit seit der Erstellung des Posts und der Punktzahl eines Posts abhängt, haben Sie wirklich nur zwei Möglichkeiten. Sie können entweder alle Beiträge erhalten und die Rankings clientseitig berechnen (was in Ihrem Fall keine Option ist) oder Sie können die Rankings berechnen, wenn ein Update auf den Post gemacht wird. Außerdem gebe ich meine Beispiele in Swift.
Struktur des DB für dieses Beispiel:
posts : {
$post: {
stats : {
score : scoreValue,
ranking : rankingValue,
createdAt : timestamp
}
}
}
Konkret bedeutet dies, dass, wenn eine neue Nachricht erstellt wird Sie es den Standard Punktzahl vergeben werden und das Ranking errechnen.
Da die Rangliste nun in der Datenbank gespeichert ist, können Sie einfach die oben x Beiträge holen, indem Sie
postsRef.queryOrdered(byChild:"stats/ranking").queryLimited(toLast: x)
oder vielleicht
ref.queryOrdered(byChild: "stats/ranking").queryEnding(atValue: "lowestScoreSoFar").queryLimited(toLast: x)
Nun, um sicherzustellen, dass ein Post-Ranking bleibt bis zu Datum können Sie einfach das Ranking in der gleichen Operation (Transaktion) aktualisieren, wo Sie die Punktzahl aktualisieren.
ref.runTransactionBlock({ (currentData: FIRMutableData) -> FIRTransactionResult in
if var stats = currentData.value as? [String : Any] {
var score = stats["score"] as? Int
var createdAt = stats["createdAt"] as? Long
score += 1
var ranking = calculateRanking(score, createdAt)
stats["score"] = score
stats["ranking"] = ranking
currentData.value = stats
return FIRTransactionResult.success(withValue: currentData)
}
return FIRTransactionResult.success(withValue: currentData)
}) { (error, committed, snapshot) in
if let error = error {
print(error.localizedDescription)
}
}
Ein Problem bei diesem Verfahren ist die Tatsache, dass ein Beitrag mit einer hohen Punktzahl halten, wenn niemand Stimmen auf sie oben schwimmen. Um mit dieser Hacker News fertig zu werden, scheint auf ihrem Server ein Skript zu laufen, das alle 30 Sekunden das Ranking eines zufälligen Posts in der obersten x aktualisiert. Sie müssten einen Server ausführen und sehen, welche Einstellung für Ihren speziellen Fall am besten geeignet ist.
Da die Bewertung aller Beiträge sich bis zum Erreichen von 0 entwickeln wird, wenn Sie einen ähnlichen Algorithmus wie Hacker News verwenden, können Sie versuchen, die Rangfolge von Beiträgen mit einem Rang oberhalb einer bestimmten Schwelle nach dem Zufallsprinzip zu aktualisieren ältere und irrelevante Beiträge ignorieren).
Hacker News Algorithm
More info on the algorithm
How often does Hacker News recalculate rankings
How Hacker News algorithm really works
Dank @Pieter Laebens für deine Antwort. Ich habe über diese Methode nachgedacht. Wenn meine Punkte jedoch nur Rohpunkte sind und ich die Beiträge basierend auf Rankings paginieren möchte, da das Ranking auch mit der Zeit korreliert ist (ältere Posts erhalten niedrigere Rankings), wie soll ich diese Daten paginieren? – ndduong
Wird die Punktzahl wie eine Transaktion erhöht oder wird diese auch berechnet? –
Wie auch immer, ich habe meine Antwort aktualisiert. –