>我有一个记录器,每5秒写入一次数据。
它用于两个目的:
- 获取最新数据记录
- 获取 1 个月或一周的记录。
因此,我希望它始终保留最新的书面记录,但是请确保记录之间的时间范围(不包括最后一个记录(至少为一分钟。为此,我想定期运行数据库清理脚本。
需要有关算法的帮助,该算法将删除时间戳太接近的数据库条目。
删除所有记录:)的不起作用示例
let wasRemoved: boolean = true;
while(wasRemoved) {
const logs = await logsRepository.find({parent: {id: parents[0].id}});
const startL = logs.length;
console.log('start: ' + startL);
for (let i = 0; i < logs.length - 2; i++) {
if (i + 1 < logs.length-2 &&
DataHelpers.getSecondsBetweenDates(logs[i].createdAt, logs[i+1].createdAt) < 60) {
console.log(DataHelpers.getSecondsBetweenDates(logs[i].createdAt, logs[i+1].createdAt));
logs.splice(i+1, 1);
wasRemoved = true;
await logsRepository.delete(logs[i+1].id);
}
}
if (startL === logs.length) wasRemoved = false;
console.log('end: ' + logs.length);
}
基本上它总是删除下一条记录。请帮助使用正确的算法来解决此问题。
谢谢!
您可以使用.reduce()
来过滤日志: 只需将过滤后的数组保留为累加器,并在每次迭代时比较当前和上次过滤元素的createdAt
字段:
const logs = [
{createdAt: 0},
{createdAt: 10},
{createdAt: 30},
{createdAt: 70},
{createdAt: 80},
{createdAt: 90},
{createdAt: 140},
{createdAt: 200},
{createdAt: 210},
{createdAt: 220}
];
const filtered = logs.reduce((filtered, cur, i, array) => {
if (!filtered.length ||
i === array.length - 1 ||
cur.createdAt - filtered[filtered.length - 1].createdAt >= 60) {
filtered.push(cur);
}
return filtered;
}, []);
console.log(filtered);