每分钟我都有一个脚本,可以在我的firebase数据库中推出新记录。
当列表达到固定值时,我想要的是删除最后的记录。
我曾经经过DOC和其他帖子,到目前为止我发现的东西是这样的:
// Max number of lines of the chat history.
const MAX_ARDUINO = 10;
exports.arduinoResponseLength = functions.database.ref('/arduinoResponse/{res}').onWrite(event => {
const parentRef = event.data.ref.parent;
return parentRef.once('value').then(snapshot => {
if (snapshot.numChildren() >= MAX_ARDUINO) {
let childCount = 0;
let updates = {};
snapshot.forEach(function(child) {
if (++childCount <= snapshot.numChildren() - MAX_ARDUINO) {
updates[child.key] = null;
}
});
// Update the parent. This effectively removes the extra children.
return parentRef.update(updates);
}
});
});
问题是:onWrite
似乎每次触发所有相关数据。
当列表不长时间时,这是一个很好的过程。但是我有4000个记录,每个月似乎都会用它搞砸我的firebase下载配额。
有人会知道如何处理这种情况吗?
好的,所以最后我配备了3个功能。一个更新了Arduino记录的数量,一个如果丢失了计数器,则完全介绍了它。最后一个使用计数器使用limittofirst过滤器进行查询,因此仅检索相关数据以删除。
实际上是Firebase提供的两个示例的组合:https://github.com/firebase/functions-samples/tree/master/limit-childrenhttps://github.com/firebase/functions-samples/tree/master/Child-count
这是我的最终结果
const MAX_ARDUINO = 1500;
exports.deleteOldArduino = functions.database.ref('/arduinoResponse/{resId}/timestamp').onWrite(event => {
const collectionRef = event.data.ref.parent.parent;
const countRef = collectionRef.parent.child('arduinoResCount');
return countRef.once('value').then(snapCount => {
return collectionRef.limitToFirst(snapCount.val() - MAX_ARDUINO).transaction(snapshot => {
snapshot = null;
return snapshot;
})
});
});
exports.trackArduinoLength = functions.database.ref('/arduinoResponse/{resId}/timestamp').onWrite(event => {
const collectionRef = event.data.ref.parent.parent;
const countRef = collectionRef.parent.child('arduinoResCount');
// Return the promise from countRef.transaction() so our function
// waits for this async event to complete before it exits.
return countRef.transaction(current => {
if (event.data.exists() && !event.data.previous.exists()) {
return (current || 0) + 1;
} else if (!event.data.exists() && event.data.previous.exists()) {
return (current || 0) - 1;
}
}).then(() => {
console.log('Counter updated.');
});
});
exports.recountArduino = functions.database.ref('/arduinoResCount').onWrite(event => {
if (!event.data.exists()) {
const counterRef = event.data.ref;
const collectionRef = counterRef.parent.child('arduinoResponse');
// Return the promise from counterRef.set() so our function
// waits for this async event to complete before it exits.
return collectionRef.once('value')
.then(arduinoRes => counterRef.set(arduinoRes.numChildren()));
}
});
我还没有测试过,但是很快我会发布结果!
我还听说有一天Firebase会添加"大小"查询,这在我看来肯定是缺少的。