NodeJS Firebase循环缓冲区或队列

时间:2018-03-31 19:02:49

标签: node.js firebase firebase-realtime-database circular-buffer

我正在使用Firebase和Nodejs。我希望将battleReports中的记录数限制为数字N.但不仅限制。如果有新数据,battleReports中已有N条记录,请删除最旧的数据并添加新数据。我想实现循环队列或缓冲区之类的东西。有可能吗?

  players: {
    'player1-id': {
      battleReports: {
        'battle-report-1': {/* report object */},
        'battle-report-2': {/* report object */},
        'battle-report-3': {/* report object */}
        // ... 
      }
    },
    'player2-id': {
      battleReports: {
        'battle-report-1': {/* report object */},
        'battle-report-2': {/* report object */},
        'battle-report-3': {/* report object */}
        // ... 
      }
    },
    // ...
  }

1 个答案:

答案 0 :(得分:1)

当然,但我建议将battleReports的子项更改为使用自动生成的键(例如push方法)。

这样,battleReports将始终按照添加时间顺序排序。

无论如何,创建看起来像这样的数据库函数:

this.battleReportLimiter = functions.database.ref('battleReports/{newReport}').onCreate(event => {
  return admin.database().ref('battleReports').orderByKey().limitToFirst(1).once('value').then(event => {
    return admin.database().ref('battleReports').child(event).remove();
  });
});

您不必使用自动生成的密钥和orderByKey(),如果需要,还可以使用其他规则here(在数据库规则中需要indexOn: [<child>]规则)。

摘要:解决方案只是通过键或子/值创建某种排序技术。然后,您只需要使用{newReport}之类的变量来监听onCreate,或者在childAdded上收听battleReports。然后使用任何技术获取最旧的(在自动生成时始终是第一个键),然后将其删除。