如何在Firebase中增加记录?

use*_*677 9 javascript firebase firebase-realtime-database

我为每个用户提供了Firebase记录"搜索: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
       });
    }
}
Run Code Online (Sandbox Code Playgroud)

有什么帮助让这个工作?

谢谢.

小智 19

你可以使用交易

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

databaseRef.transaction(function(searches) {
  if (searches) {
    searches = searches + 1;
  }
  return searches;
});
Run Code Online (Sandbox Code Playgroud)

  • `searching = 0`时你的代码不起作用.你可以这样做:`return(searching || 0)+ 1;` (19认同)

Ole*_*leg 18

ServerValue.increment()firebase JavaScript SDK v7.14.0 中有一个新方法

由于不需要往返,因此性能更好且更便宜。

这里

添加 ServerValue.increment() 以支持没有事务的原子字段值增量。

API文档在这里

用法示例:

firebase.database()
    .ref('users')
    .child(user_uid)
    .child('searches')
    .set(firebase.database.ServerValue.increment(1))
Run Code Online (Sandbox Code Playgroud)

或者你可以递减,就像这样放置-1函数 arg :

firebase.database()
    .ref('users')
    .child(user_uid)
    .child('searches')
    .set(firebase.database.ServerValue.increment(-1))
Run Code Online (Sandbox Code Playgroud)

  • 伟大的更新奥列格。现在,实时数据库确实还有一个“增量”操作,其性能明显优于使用事务(请参阅我的测试[此处](/sf/ask/4307534241/ -在-firebase-实时数据库上原子地增量值))。 (3认同)

Mat*_*son 6

对于实时数据库,使用transaction似乎是最好的方法。请参阅周日 G Akinsete 的答案

从他的回答和相关评论来看:

firebase
    .database()
    .ref('users')
    .child(user_uid)
    .child('searches')
    .transaction(function(searches) {
        return (searches || 0) + 1
    })
Run Code Online (Sandbox Code Playgroud)

对于Firestore 数据库,您可以使用Firebase Sentinel 值来增加/减少一个值,而不必先获取它

增量

firebase
    .firestore()
    .collection('users')
    .doc('some-user')
    .update({ 
         valueToIncrement: firebase.firestore.FieldValue.increment(1) 
    })
Run Code Online (Sandbox Code Playgroud)

递减

firebase
    .firestore()
    .collection('users')
    .doc('some-user')
    .update({ 
        valueToDecrement: firebase.firestore.FieldValue.increment(-1) 
    })
Run Code Online (Sandbox Code Playgroud)

文档参考


ton*_*har 5

对于实时数据库,使用increment()效果很好 - 这是一个使用较新的 ESM 语法的客户端 JS 示例

import { getDatabase, ref, set, increment } from  "https://www.gstatic.com/firebasejs/9.1.3/firebase-database.js";


// Initialize Firebase
const firebaseConfig = { ...};
const app = initializeApp(firebaseConfig);


const writeFavNameData = name => {
    const db = getDatabase();
    const favRef = ref(db, 'favorites/' + name);
    set(favRef, {
            name,
            likes: increment(1)
    });
};

writeFavNameData("Petunia"); // `likes` is initialized at 1
writeFavNameData("Petunia"); // `likes` is now 2
Run Code Online (Sandbox Code Playgroud)