Expirar os dados com a API do Azure Cosmos DB para MongoDB

APLICA-SE AO: MongoDB

A funcionalidade de vida útil (TTL) permite que o banco de dados expire automaticamente os dados. A API do Azure Cosmos DB para MongoDB usa as funcionalidades de TTL principais do Azure Cosmos DB. Há suporte para dois modos: definindo um valor de TTL padrão em toda a coleção e definindo valores TTL individuais para cada documento. A lógica que rege os índices de TTL e os valores de TTL por documento na API do Azure Cosmos DB para MongoDB é a mesma que no Azure Cosmos DB.

Índices TTL

Para habilitar a vida útil universalmente em uma coleção, um "Índice TTL" (índice de vida útil) precisa ser criado. O índice TTL é um índice no campo _ts com um valor "expireAfterSeconds".

Exemplo do MongoShell:

globaldb:PRIMARY> db.coll.createIndex({"_ts":1}, {expireAfterSeconds: 10})

O comando no exemplo acima criará um índice com a funcionalidade de vida útil.

A saída do comando inclui vários metadados:

{
        "_t" : "CreateIndexesResponse",
        "ok" : 1,
        "createdCollectionAutomatically" : true,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 4
}

Quando o índice for criado, o banco de dados excluirá automaticamente todos os documentos nessa coleção que não foram modificados nos últimos 10 segundos.

Observação

_ts é um campo específico do Azure Cosmos DB e não pode ser acessado por clientes do MongoDB. É uma propriedade reservada (sistema) que contém o carimbo de data/hora da última modificação do documento.

Exemplo de Java:

MongoCollection collection = mongoDB.getCollection("collectionName");
String index = collection.createIndex(Indexes.ascending("_ts"),
new IndexOptions().expireAfter(10L, TimeUnit.SECONDS));

Exemplo de C#:

var options = new CreateIndexOptions {ExpireAfter = TimeSpan.FromSeconds(10)}; 
var field = new StringFieldDefinition<BsonDocument>("_ts"); 
var indexDefinition = new IndexKeysDefinitionBuilder<BsonDocument>().Ascending(field); 
await collection.Indexes.CreateOneAsync(indexDefinition, options); 

Definir o valor de vida útil de um documento

Também há suporte para valores de vida útil por documento. Os documentos devem conter uma propriedade de nível raiz "ttl" (em minúsculas) e um índice de TTL conforme descrito acima deve ter sido criado para essa coleção. Os valores de vida útil definidos em um documento substituem o valor de TTL da coleção.

O valor de TTL deve ser um int32. Como alternativa, um int64 que se ajusta a um int32, ou um duplo sem partes decimais que se ajusta a um int32. Os valores da propriedade TTL que não estão em conformidade com essas especificações são permitidos, mas não são tratados como um valor de vida útil do documento significativo.

O valor de TTL para o documento é opcional. Os documentos sem um valor de TTL podem ser inseridos na coleção. Nesse caso, o valor de TTL da coleção será respeitado.

Os documentos a seguir têm valores de vida útil válidos. Assim que os documentos são inseridos, os valores de TTL do documento substituem valores de TTL da coleção. Portanto, os documentos serão removidos após 20 segundos.

globaldb:PRIMARY> db.coll.insert({id:1, location: "Paris", ttl: 20.0}) 
globaldb:PRIMARY> db.coll.insert({id:1, location: "Paris", ttl: NumberInt(20)}) 
globaldb:PRIMARY> db.coll.insert({id:1, location: "Paris", ttl: NumberLong(20)}) 

Os documentos a seguir têm valores de vida útil inválidos. Os documentos são inseridos, mas o valor de TTL do documento não será respeitado. Portanto, os documentos serão removidos após 10 segundos devido ao valor de TTL da coleção.

globaldb:PRIMARY> db.coll.insert({id:1, location: "Paris", ttl: 20.5}) //TTL value contains non-zero decimal part. 
globaldb:PRIMARY> db.coll.insert({id:1, location: "Paris", ttl: NumberLong(2147483649)}) //TTL value is greater than Int32.MaxValue (2,147,483,648). 

Próxima etapa