【发布时间】:2017-09-14 06:02:04
【问题描述】:
我每分钟都有一个脚本在我的 firebase 数据库中推送一条新记录。
我想要的是当列表长度达到固定值时删除最后的记录。
我浏览过文档和其他帖子,到目前为止我发现的东西是这样的:
// 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 下载配额。
有没有人知道如何处理这种情况?
【问题讨论】:
-
考虑单独计算所有记录并使用它来确定要删除的记录数,使用查询限制来仅查找应删除的记录。
-
是的,这似乎是最好的选择。但是,如果不可能在整个列表上触发,如何使该计数器保持最新状态?可能是特定节点上的 onCreate 和 onDelete 与 '/arduinoResponse/{res}' 的组合?
-
是的,onCreate 和 onDelete 可能工作得很好。还请考虑您应该使用事务来防止对某个位置的并发写入发生冲突。
标签: javascript firebase firebase-realtime-database google-cloud-functions