ユーザーごとにFirebaseレコード「searches:0」があります。あるイベントで、現在のカウントに1を追加したいと思います。私はここまで到達しましたが、何らかの理由で機能していません:
du.fbAddSearchCount = function() {
var usr = new Firebase(firebase_url + "/users/" + user_uid);
usr.on("value", function(snapshot) {
user = snapshot.val();
var usersRef = ref.child("users");
var fbUser = usersRef.child(user_uid);
fbUser.update( {
searches: user.searches + 1
});
}
}
これを機能させるための助けはありますか?
ありがとうございました。
トランザクションを使用できます
var databaseRef = firebase.database().ref('users').child(user_uid).child('searches');
databaseRef.transaction(function(searches) {
if (searches) {
searches = searches + 1;
}
return searches;
});
Realtime Databaseの場合、transaction
を使用するのが最善の方法のようです。 Sunday G Akinseteからの回答 を参照してください。
彼の答えと関連するコメントから:
firebase
.database()
.ref('users')
.child(user_uid)
.child('searches')
.transaction(function(searches) {
return (searches || 0) + 1
})
Firestoreデータベースの場合、 Firebase Sentinel値 を使用して、最初にフェッチしなくても値をインクリメント/デクリメントできます。
インクリメント
firebase
.firestore()
.collection('users')
.doc('some-user')
.update({
valueToIncrement: firebase.firestore.FieldValue.increment(1)
})
デクリメント
firebase
.firestore()
.collection('users')
.doc('some-user')
.update({
valueToDecrement: firebase.firestore.FieldValue.increment(-1)
})
ref.transection(function(queue_length) {
if(queue_length|| (queue_length === 0))
{
queue_length++;
}
return queue_length;
})
あなたはこのように使うことができます;)
database.ref("users").child("user_uid").transaction((user) => {
if (user) {
user.searches = actives.searches + 1;
}
return user;
});
それはあなたのために働きます。 '.child(' searchs ')'を実行しましたが、機能しません(何も変更されていません)。