投稿は投稿が作成されてからの経過時間に応じて計算される値なので、投稿が受け取ったスコアは実際には2つのオプションしかありません。すべての投稿を取得し、クライアント側のランキング(あなたの場合はオプションではない)を計算するか、投稿が更新されるたびにランキングを計算することができます。また、スウィフトで私の例を挙げています。この例のDBの
構造:
posts : {
$post: {
stats : {
score : scoreValue,
ranking : rankingValue,
createdAt : timestamp
}
}
}
具体的には、これは新しいポストが作成されたとき、あなたはそれをデフォルトのスコアを割り当てて、順位を計算するだろうことを意味します。
ランキングは今、あなたは、単にポストのランキングは最大のまま確認するために、今すぐ
postsRef.queryOrdered(byChild:"stats/ranking").queryLimited(toLast: x)
または多分
ref.queryOrdered(byChild: "stats/ranking").queryEnding(atValue: "lowestScoreSoFar").queryLimited(toLast: x)
を使用して上位xの投稿を取得することができ、データベースに格納されているので、スコアを更新するのと同じ操作(トランザクション)でランクを更新することができます。
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)
}
}
この方法の問題点は、スコアが高い投稿は誰も投票しないとトップに浮かぶことになります。これを処理するために、Hacker Newsはサーバー上でスクリプトを実行しているようだ。30秒ごとにトップxの1つのランダム投稿のランキングを更新する。サーバーを実行して、特定の状況に最も適した設定を確認する必要があります。
Hacker Newsに類似したアルゴリズムを使用している場合は、すべての投稿の評価が0に近づくため、ランダムに特定のしきい値以上の順位の投稿のランキングを更新できます。古いものと無関係なものは無視する)。あなたの答えのためのLaebens @Pieter
Hacker News Algorithm
More info on the algorithm
How often does Hacker News recalculate rankings
How Hacker News algorithm really works
感謝。私はこの方法について考えました。しかし、私のポイントが生のポイントだけであって、ランク付けが時間と関連しているように(古いポストのランクが下がっているので)、このデータのページ付けはどうすればいいですか? – ndduong
スコアはトランザクションのように増分されているのか、それとも計算されていますか? –
とにかく、私は自分の答えを更新しました。 –