【问题标题】:How to increment a record in Firebase?如何在 Firebase 中增加记录?
【发布时间】:2015-10-04 01:32:20
【问题描述】:

我有每个用户的 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
       });
    }
}

有什么帮助可以让它工作吗?

谢谢。

【问题讨论】:

  • 什么是 user.searches?
  • 这将是当前在火力基地中用户“搜索”记录中的值。例如,如果它是 5,我希望这个脚本将其更新为 6。
  • 那么什么不起作用?必须提供更多细节。它是否完全更新记录但不使用新号码?
  • 什么事件应该触发搜索计数的增加?

标签: javascript firebase firebase-realtime-database


【解决方案1】:

对于实时数据库,使用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

【讨论】:

  • 感谢您展示 Firebase 9 语法。我在文档中找不到任何关于如何像这样使用增量的示例。
【解决方案2】:

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

因为不需要往返,所以性能更好且更便宜。

here

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

API 文档here

使用示例:

firebase.database()
    .ref('users')
    .child(user_uid)
    .child('searches')
    .set(firebase.database.ServerValue.increment(1))

或者你可以递减,只要把-1作为函数arg,就像这样:

firebase.database()
    .ref('users')
    .child(user_uid)
    .child('searches')
    .set(firebase.database.ServerValue.increment(-1))

【讨论】:

  • 伟大的更新奥列格。现在确实还有一个用于实时数据库的increment 操作,它的性能明显优于使用事务(参见我的测试here)。
【解决方案3】:
database.ref("users").child("user_uid").transaction((user) => {
    if (user) {
        user.searches = actives.searches + 1;
    }
    return user;
});

它适合你。 我做了那个 '.child('searches')' 但它不起作用。(没有改变)。

【讨论】:

    【解决方案4】:

    对于实时数据库,使用transaction 似乎是最好的方法。见the answer from Sunday G Akinsete

    从他的回答和相关的cmets:

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

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

    增量

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

    Documentation Reference

    【讨论】:

    • 很好,但最初的问题似乎是使用实时数据库而不是 Firestore。
    • 啊,是的,我没有注意到,我更新了答案以指定仅适用于 Firestore。谢谢!
    【解决方案5】:
    ref.transection(function(queue_length) {
        if(queue_length|| (queue_length === 0))
        {
            queue_length++; 
        }
        return queue_length;
    
    })
    

    你可以这样使用;)

    【讨论】:

    • 解释你的答案
    • 什么环境编译javascript?
    【解决方案6】:

    你可以使用事务

    var databaseRef = firebase.database().ref('users').child(user_uid).child('searches');
    
    databaseRef.transaction(function(searches) {
      if (searches) {
        searches = searches + 1;
      }
      return searches;
    });
    

    【讨论】:

    • searches = 0 时,您的代码将不起作用。你可以这样做:return (searches || 0) + 1;
    猜你喜欢
    • 2017-06-23
    • 1970-01-01
    • 2020-12-07
    • 2016-05-10
    • 1970-01-01
    • 1970-01-01
    • 2019-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多