有没有办法使用 CosmosDb 的 TTL 功能,但始终至少保留 n 条记录
Is there a way to use the TTL feature of CosmosDb but always keep at least n records
我有正在写入 cosmos 的设备的诊断数据,一些设备每天写入 1000 条消息,而其他设备只写入几条。我总是希望有诊断数据,无论何时添加,但我不想永远保留所有这些数据。添加 90 天的 TTL 对于非常活跃的设备来说效果很好,它们将始终具有诊断数据,因为它们每天都会发送这些数据。不太活跃的设备将在 TTL 后丢失其诊断日志。
有没有办法使用 CosmosDb 的 TTL 功能,但始终至少保留 n 条记录?
我正在寻找诸如仅保留最近 90 天 (TTL) 的记录之类的东西,但无论上次更新的时间戳如何,始终至少保留 100 个文档。
TTL 没有内置的基于数量的过滤器:您要么有基于集合的 TTL,要么有集合+项目 TTL(基于项目的 TTL 覆盖集合中的默认设置)。
您需要自己创建一些东西,将符合条件的文档标记为要删除(也许是基于时间段?),然后 运行 基于项目计数、年龄的定期清理例程符合删除条件的项目等
或者,您可以区别对待低容量和高容量设备,将高容量设备遥测写入基于 TTL 的集合,将低容量设备遥测写入非 TTL 集合(或类似的东西) )...
tl;dr 这不是内置的东西。
简短的回答:没有这样的内置功能。
您可以创建自己的 Function App,在触发查询的计划触发器上工作:
SELECT *
FROM c
WHERE NOT IS_DEFINED(c.ttl) --only update items that have no ttl
ORDER BY c._ts DESC
OFFSET 100 LIMIT 2147483647 --skip the newest 100
然后通过为它们设置 ttl
来更新其中的项目。这样您就可以确信最新的 100 条记录仍然可用(假设您没有其他进程删除其他记录),同时定期清理其他项目。请记住,更新会重置 tll
,因为 _ts
将被更新。
我有正在写入 cosmos 的设备的诊断数据,一些设备每天写入 1000 条消息,而其他设备只写入几条。我总是希望有诊断数据,无论何时添加,但我不想永远保留所有这些数据。添加 90 天的 TTL 对于非常活跃的设备来说效果很好,它们将始终具有诊断数据,因为它们每天都会发送这些数据。不太活跃的设备将在 TTL 后丢失其诊断日志。
有没有办法使用 CosmosDb 的 TTL 功能,但始终至少保留 n 条记录?
我正在寻找诸如仅保留最近 90 天 (TTL) 的记录之类的东西,但无论上次更新的时间戳如何,始终至少保留 100 个文档。
TTL 没有内置的基于数量的过滤器:您要么有基于集合的 TTL,要么有集合+项目 TTL(基于项目的 TTL 覆盖集合中的默认设置)。
您需要自己创建一些东西,将符合条件的文档标记为要删除(也许是基于时间段?),然后 运行 基于项目计数、年龄的定期清理例程符合删除条件的项目等
或者,您可以区别对待低容量和高容量设备,将高容量设备遥测写入基于 TTL 的集合,将低容量设备遥测写入非 TTL 集合(或类似的东西) )...
tl;dr 这不是内置的东西。
简短的回答:没有这样的内置功能。
您可以创建自己的 Function App,在触发查询的计划触发器上工作:
SELECT *
FROM c
WHERE NOT IS_DEFINED(c.ttl) --only update items that have no ttl
ORDER BY c._ts DESC
OFFSET 100 LIMIT 2147483647 --skip the newest 100
然后通过为它们设置 ttl
来更新其中的项目。这样您就可以确信最新的 100 条记录仍然可用(假设您没有其他进程删除其他记录),同时定期清理其他项目。请记住,更新会重置 tll
,因为 _ts
将被更新。