如何为Firebase中的现有对象增加值?

时间:2017-08-16 13:05:02

标签: node.js firebase firebase-realtime-database

我正在建立一个计步器应用程序。 我有一个iOS应用程序将每天的总和推到/ users / {mobile} / steps / {date} / 更新或添加新步骤子项时,我想对该特定用户的所有步骤的值求和,并更新其stepsTotal

实现我需要的

  1. 找到原始用户并总结所有步骤。
  2. 将新值保存到stepsTotal。
  3. 如果有人能在这里提供一些帮助,我将不胜感激。 : - )

    数据库

    {
    
      "users": {
        "92291000": {
          "firstName": "Tore",
          "stepsTotal": "1500",
          "steps": {
            "02-09-2017": "500",
            "03-09-2017": "1000"
          },
    

    import.js

    var db       = admin.database();
    var dbRoot   = db.ref("/");
    var usersRef = dbRoot.child("users");
    
    // This works    
    function saveUser(attributes) {
      let mobile =  attributes.mobile;
      delete attributes['mobile']
      let user = usersRef.child(mobile);
      user.update(attributes);
    }
    
    
    function increaseSteps( { mobile=null, steps=null } = {}) {
      // Find the User
      console.log("looking for mobile", mobile);  // OK
      let userRef = usersRef.child(mobile);
    
      // Here I'm not able to read the old data from the user.
      userRef.transaction(function(user) {
        console.log("user: ", user);  // null
        // ^ User is null. 
      });
    
    
    /*  
      If I mangage to find user above, I expect to do something like this. 
      Or it is possible to only update *stepsTotal*?
    */
    
      let attributes = {
        firstName: user.firstName,
        lastName: user.lastName,
        stepsTotal: user.stepsTotal + steps,
      }
      user.update( attributes );
    }
    

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您在代码片段中遇到问题:

let userRef = usersRef.child(mobile);

// Here I'm not able to read the old data from the user.
userRef.transaction(function(user) {
  console.log("user: ", user);  // null
  // ^ User is null. 
});

在Firebase数据库事务中,初始值通常为null。来自Firebase documentation on transactions

  

交易功能被多次调用

     

您的事务处理程序被多次调用,并且必须能够处理null数据。即使数据库中存在现有数据,也可能在运行事务函数时本地缓存它。

这是由于Firebase事务在幕后的工作原理。要了解有关详情,请参阅我的答案Transcation updateFunction parameter is nullFirebase runTransaction not working

解决方案是处理这两种情况:如果用户节点尚不存在,则计算初始步数,否则更新步骤数:

let userRef = usersRef.child(mobile);

userRef.transaction(function(user) {
  return (user || 0) + new_steps_for_user;
});