【发布时间】:2018-06-18 18:07:24
【问题描述】:
这是我的 firebase 数据库的结构:
/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。
- 在 {pushId} 设备中的每次更改时,该函数都会运行无用,因为这不会更改设备的数量。
我应该用
替换 countNumberOfAllDevices两个功能:
incrementNumberOfAllDevices和onCreate(创建设备对象后不再创建子对象)decrementNumberOfAllDevices和onDelete(在删除设备对象之前没有删除任何子对象)
或
深入了解来自
的快照参考/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);
}
});
}
【问题讨论】:
-
change.after.exists() && !change.before.exists()和!change.after.exists() && change.before.exists()仅用于选择创建和删除。我不确定为什么这些子句中的任何一个都与创建较低级别的节点/值相匹配。你能在这个函数中展示触发该行为的最小 Java 代码吗? -
谢谢弗兰克,这很奇怪。当我从控制台添加设备时,它会增加一,当我运行如下代码时,它会增加两次:
-
public static void 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); } }) ; }
-
testAddNewDeviceToDevices只写入数据库一次(push()不会导致写入),所以我认为这不会导致计数器上升两次。
标签: node.js firebase google-cloud-functions