Firebaseにカウントクエリがないこと、カウンタを持つメソッドが2つ、クライアント側ですべてのデータを取得すること、またはデータベースにカウント値を格納することがわかっています。私はこの第2の方法を使用します。なぜなら、第1の方法はデータが少ないときだけ有効であるからです。Firebaseカウンター、大量更新ケース
このメソッドの問題は、私は多くの同時ライターを持つことができます、私はデータが格納されていない場合、インクリメントまたはデクリメントカウンタでデータを保存しようとする私の方法でこの問題を解決した。
OKこの方法は1つのカウンタのみを変更する場合にはうまくいきましたが、別のケースでは1つのトランザクションで多くの異なるカウンタを変更する必要があります。このモードでは、異なる試行後にデータを保存できないなぜなら、私たちは多くの異なるノードに同時に多くのライターを置くことができるからです。アトミックな更新とデータ構造の一例は以下の通りです:
私はこの
"comment": {
"counter": {},
"Data": {
"$Comment":{}
}
}
comment/counter = val + 1
comment/Data/comment1 = data
を保存する場合は、私が更新に失敗した場合、他の作家はカウンタを更新しているので、それは私が新しいと再試行することができたときだけで動作しますカウンタ値と、通常は最初の時間の後、私は成功して操作を締結、私は、ユーザーおよびすべての彼の行動を削除したい場合は、たとえば、私はこのタイプのデータを格納したい
"comment":{
"counter":{},
"Data": {
"$Comment":{}
}
},
"$user": {
"follower":{
"counter":{},
"data":{
"$Follower": {}
}
}
}
comment/counter = val - 1
comment/Data/comment2 = null
user1/follower/counter = val - 1
user1/follower/data/user30 = null
user2/follower/counter = val - 1
user2/follower/data/user30 = null
user3/follower/counter = val - 1
user3/follower/data/user30 = null
見えるのそれ一括更新の場合、私は多くのカウンターを更新する必要があります。この場合、異なる再試行後にすべてのカウンタを更新することが不可能であることは非常に簡単です。 1 -
別の場合は、この場合、この
"photo":{
"$photo":{
"comment":{
"counter":{},
"Data": {
"$Comment":{}
}
}
}
photo/10/comment/counter = val - 1
photo/10/comment/Data/comment1 = null
photo/10/comment/counter = val - 1
photo/10/comment/Data/comment2 = null
photo/10/comment/counter = val - 1
photo/10/comment/Data/comment3 = null
ある私は値+1または値が等しいとすることができる同じカウンタと異なるコメントを削除しようとするので、カウンタを更新することは不可能です私はすべてのユーザーデータを削除したい場合、彼は同じ写真にいくつかのコメントを書く可能性がありますが、カウンタは単一のトランザクションでのみ更新できるので、このコメントのすべてを1つのトランザクションで削除することはできません。
どのようなタイプのデータベース(sqlまたはnosql)にも存在するカウントクエリが存在しないため、多くの複雑な問題が発生します。私はなぜなのか理解していない。これには時間を無駄にすることなく解決できる多くの問題が含まれます
以下は、カウンタを更新するための私のjavascript機能です。それあなたがtransactionsを探しているので、他の人の同時ライター
this.singleUpdate = function (paths, increment, countPath, retryCounter, callback) {
firebase.database().ref(countPath).once('value', function (counter) {
var value = counter.val() ? counter.val().value : 0;
var countValue = increment ? value + 1 : value - 1;
paths[countPath] = { value: null };
if (!increment && countValue == 0) { paths[countPath] = null; }
else {
paths[countPath].value = countValue;
}
firebase.database().ref().update(paths, function (error) {
if (error) {
retryCounter++;
if (retryCounter < 3) { singleUpdate(paths, increment, countPath, retryCounter, callback); }
else { callback(false, error); }
} else {
return callback(true, countValue);
}
});
});
}
これは質問ですか?もしそうなら、私たちのデータを理解するためにFirebase構造の問題とスニペットを示すコード例をテキストとして提供してください。 – Jay
私はカウンタを更新するために私の機能をポストしていますが、問題はクライアントコードではなくfirebaseのデータ構造内にあります。しかしfirebaseにカウントのクエリが存在しないこれは私が考えているユニークな方法です – DThink