Dados de expiração com a API do Azure Cosmos DB para MongoDB

APLICA-SE A: MongoDB

A funcionalidade Time-to-live (TTL) permite à base de dados expirar automaticamente os dados. A API do Azure Cosmos DB para MongoDB utiliza as principais capacidades TTL do Azure Cosmos DB. São suportados dois modos: definir um valor TTL predefinido em toda a coleção e definir valores TTL individuais para cada documento. A lógica que rege os índices TTL e os valores TTL por documento na API do Azure Cosmos DB para MongoDB é igual ao do Azure Cosmos DB.

Índices TTL

Para ativar o TTL de forma universal numa coleção, tem de criar um "Índice TTL" (índice time-to-live). O índice TTL é um índice no _ts campo com um valor "expireAfterSeconds".

Exemplo do MongoShell:

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

O comando no exemplo acima irá criar um índice com a funcionalidade TTL.

O resultado do comando inclui vários metadados:

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

Depois de criar o índice, a base de dados irá eliminar automaticamente todos os documentos nessa coleção que não tenham sido modificados nos últimos 10 segundos.

Nota

_ts é um campo específico do Azure Cosmos DB e não está acessível a partir de clientes 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 TTL para um documento

Os valores TTL por documento também são suportados. O(s) documento(s) tem(êm) de conter uma propriedade de nível de raiz "ttl" (minúscula) e deve ter criado um índice TTL, conforme descrito acima, para essa coleção. Os valores TTL definidos num documento irão substituir o valor de TTL da coleção.

O valor TTL tem de ser um número int32. Em alternativa, um int64 que se adeque a um int32 ou um valor duplo sem casa decimal que se adeque a um int32. São permitidos valores para a propriedade do TTL que não estão em conformidade com estas especificações, mas não são tratados como um valor TTL de documento significativo.

O valor TTL para o documento é opcional; os documentos sem um valor TTL podem ser inseridos na coleção. Neste caso, será utilizado o valor de TTL da coleção.

Os seguintes documentos têm valores TTL válidos. Assim que os documentos forem inseridos, os valores TTL do documento substituem os valores TTL da coleção. Por isso, 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 seguintes documentos têm valores TTL inválidos. Os documentos serão inseridos, mas o valor TTL do documento não será cumprido. Por isso, os documentos serão removidos após 10 segundos devido ao valor 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). 

Passos seguintes