删除/创建节点时触发计数器,但也触发子项更改

时间:2018-06-18 18:07:24

标签: node.js firebase google-cloud-functions

这是我的firebase db的结构:

/UserData
/DeviceMgmt
  /Counters
      /NumberOfAll:
      /NumberOfSelected
      /TotalDownloaded
    ...
  /Devices
      /pushId1
        /uid
        /toSelect=true (optional)
        /downloaded
        /lastDownload

      /pushId2
      /pushId2
       ...

我的代码:

exports.countNumberOfAllDevices = functions.database.ref('/UserData/DeviceMgmt/Devices/{pushId}').onWrite(
(change) => {
  const collectionRef = change.after.ref;// /UserData/DeviceMgmt/Devices/{pushId}
  const countRef = collectionRef.parent.parent.child('Counters/NumberOfAll');

  let increment;
  if (change.after.exists() && !change.before.exists()) {
    increment = 1;
  } else if (!change.after.exists() && change.before.exists()) {
    increment = -1;
  } else {
    return null;
  }

  return countRef.transaction((current) => {
    return (current || 0) + increment;
  }).then(() => {
    return console.log('counter /UserData/Counters/NumberOfAll updated.');
  });
});

基于functions-samples/child-count/推送消息被我的设备替换,但我的设备有子节点,示例中的消息没有子女。

我的问题是:

1。 当我的设备在java中创建时,一个写入是对象创建,另一个是对其子进行更新,因此NumberOfAll计数器增加2。

  1. 在{pushId}设备中的每次更改时,该功能都无法运行,因为这不会改变设备的数量。
  2. 我应该用

    替换countNumberOfAllDevices

    两个功能:

    1. incrementNumberOfAllDevices onCreate(创建设备对象后,之后不再创建子项)

    2. 带有decrementNumberOfAllDevices
    3. onDelete(在删除设备对象之前,之前没有删除子项)

    4. OR

      深入了解

      的快照参考
      /Devices/{pushId}
      

      /Devices/{pushId}/uid
      

      在创建和删除之间永远不会更改uid?

      触发云功能的我的Java代码:

      testAddNewDeviceToDevices(String token) { 
        Device device = new Device( "Test", 0, token); 
        String deviceKey = dbRefDevices.push().getKey(); 
        dbRefDevices.child(deviceKey).setValue(device)
          .addOnFailureListener(new OnFailureListener() { 
            @Override public void onFailure(@NonNull Exception e) { 
              Log.e(TAG, "failed. Exception: ", e); 
            } 
          }); 
        }
      

1 个答案:

答案 0 :(得分:0)

你应该使用onCreate和onDelete。它们是在SDK的1.0版本中引入的,与您描述的情况完全相同。它将大大简化您的代码。

IMO,onWrite没那么有用。它是1.0天之前的传统触发器。