web-dev-qa-db-ja.com

Firebaseでレコードをインクリメントするにはどうすればよいですか?

ユーザーごとに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
       });
    }
}

これを機能させるための助けはありますか?

ありがとうございました。

11
user1661677

トランザクションを使用できます

var databaseRef = firebase.database().ref('users').child(user_uid).child('searches');

databaseRef.transaction(function(searches) {
  if (searches) {
    searches = searches + 1;
  }
  return searches;
});
20

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) 
    })

ドキュメントリファレンス

2
Mathias Gilson
ref.transection(function(queue_length) {
    if(queue_length|| (queue_length === 0))
    {
        queue_length++; 
    }
    return queue_length;

})

あなたはこのように使うことができます;)

0
Sachin Kalonia
database.ref("users").child("user_uid").transaction((user) => {
    if (user) {
        user.searches = actives.searches + 1;
    }
    return user;
});

それはあなたのために働きます。 '.child(' searchs ')'を実行しましたが、機能しません(何も変更されていません)。

0
Scott Yu