Azure cosmosDB不会删除TTL过期的文档

时间:2019-07-17 15:57:09

标签: azure-cosmosdb ttl

我在Azure cosmosDB中有一个集合,在其中我启用了生存时间(TTL)功能,没有默认设置。

根据documentation,我将在此问题中提及,一切看上去都很清晰,但仍然缺少我的东西,因为经过5天,我仍然可以看到TTL为300秒的文档。

在显示收集设置的屏幕截图下方,其中TTL启用且没有默认设置。 enter image description here

根据文档:

  

自上次修改时间以来,Azure Cosmos DB将在一段时间后自动删除这些项目。生存时间值以秒为单位配置。配置TTL时,系统将根据TTL值自动删除过期项,而无需客户端应用程序明确发出的删除操作。

但这不适用于我的情况,在2019年7月17日,我可以使用300秒(5分钟)的TTL看到超过5天的文档。

{
    "ClientEnqueuedUtcTime": "2019-07-12T06:49:53.844",
    "ClientDispatchedUtcTime": "2019-07-12T06:49:53.844",
    "ServerEnqueuedUtcTime": "2019-07-12T06:49:53.8949771",
    "ServerDispatchedUtcTime": "2019-07-12T06:49:54.3659741",
    "TTL": 300,
    "EventProcessedUtcTime": "2019-07-12T06:49:55.3583521Z",
    "PartitionId": 2,
    "EventEnqueuedUtcTime": "2019-07-12T06:49:55.25Z",
    "id": "4a0edf24-6a86-4a59-f55d-d7dfe47c30fa",
    "_rid": "SBk4AJadUE6gAgEAAAAAAA==",
    "_self": "dbs/SBk4AA==/colls/SBk4AJadUE4=/docs/SBk4AJadUE6gAgEAAAAAAA==/",
    "_etag": "\"00008f1d-0000-0200-0000-5d282d930000\"",
    "_attachments": "attachments/",
    "_ts": 1562914195
}

更新答案后

我试图以小写形式保存TTL,但是它是自动转换为大写形式的,所以我认为这与预期的TTL密钥不匹配。

我应该做其他尝试吗?

解决方案:

ttl确实区分大小写,您可以将其设置为小写,在我出于某种原因进行的测试中,当我期望ttl较低时,ttl仍然是大写,所以我不正确地进行了处理那是某种保留键。

1 个答案:

答案 0 :(得分:1)

如您所见,here是该属性的情况,导致此方法不起作用。

它必须为小写。我刚刚用TTLttl进行了测试,确实第一个不起作用,但第二个却按文档中所述工作。可能是您的Json序列化器将其强制变为大写。

您可以使用JsonProperty属性将属性的大小写强制为小写。这是Microsoft文档中的ttl属性的示例。


    // Include a property that serializes to "ttl" in JSON
    public class SalesOrder
    {
        [JsonProperty(PropertyName = "id")]
        public string Id { get; set; }
        [JsonProperty(PropertyName="cid")]
        public string CustomerId { get; set; }
        // used to set expiration policy
        [JsonProperty(PropertyName = "ttl", NullValueHandling = NullValueHandling.Ignore)]
        public int? ttl { get; set; }

        //...
    }