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 os principais recursos 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 é a mesma 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 MongoShell:
globaldb:PRIMARY> db.coll.createIndex({"_ts":1}, {expireAfterSeconds: 10})
O comando no exemplo acima irá criar um índice com a funcionalidade TTL.
A saída do comando inclui vários metadados:
{
"_t" : "CreateIndexesResponse",
"ok" : 1,
"createdCollectionAutomatically" : true,
"numIndexesBefore" : 1,
"numIndexesAfter" : 4
}
Uma vez criado o índice, o banco de dados excluirá automaticamente todos os documentos dessa 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 é 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 em um documento substituem o valor 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. Os valores para a propriedade TTL que não estão em conformidade com essas especificações são permitidos, mas nã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, o valor TTL da coleção é honrado.
Os seguintes documentos têm valores TTL válidos. Depois que os documentos são 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 são inseridos, mas o valor TTL do documento não será honrado. 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).