限制火箱中的记录数



每分钟我都有一个脚本,可以在我的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会添加"大小"查询,这在我看来肯定是缺少的。

相关内容

  • 没有找到相关文章

最新更新