Faire expirer des données avec l’API Azure Cosmos DB pour MongoDB

S’APPLIQUE À : MongoDB

La fonctionnalité de durée de vie (TTL) permet à la base de données de faire expirer automatiquement les données. L’API Azure Cosmos DB pour MongoDB utilise les fonctionnalités de durée de vie de base d’Azure Cosmos DB. Deux modes sont prises en charge : la définition d’une valeur de durée de vie par défaut sur l’ensemble de la collection et la définition de valeurs de durée de vie individuelles pour chaque document. La logique d’index de durée de vie et les valeurs de durée de vie par document dans l’API d’Azure Cosmos DB pour MongoDB sont les mêmes que dans Azure Cosmos DB.

Index TTL

Pour activer universellement la durée de vie dans une collection, un « index TTL » (index de durée de vie) doit être créé. L’index TTL est un index sur le champ _ts avec une valeur « expireAfterSeconds ».

Exemple MongoShell :

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

La commande dans l’exemple ci-dessus crée un index avec la fonctionnalité de durée de vie.

La sortie de la commande comprend différentes métadonnées :

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

Une fois que l’index est créé, la base de données supprimera automatiquement tous les documents de la collection qui n’ont pas été modifiés au cours des 10 dernières secondes.

Remarque

_ts est un champ spécifique d’Azure Cosmos DB qui n’est pas accessible à partir des clients MongoDB. Il s’agit d’une propriété (système) réservée qui contient le timestamp de la dernière modification du document.

Exemple Java :

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

Exemple en code 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); 

Définir la valeur de durée de vie d’un document

Les valeurs de durée de vie par document sont également prises en charge. Les documents doivent contenir une propriété de niveau racine « ttl » (en minuscules), et un index de durée de vie comme décrit ci-dessus doit avoir été créé pour cette collection. Les valeurs de durée de vie définies sur un document remplacent la valeur de durée de vie de la collection.

La valeur de durée de vie doit être un Int32. Vous pouvez également utiliser un Int64 tenant dans un Int32, ou un double sans partie décimale tenant dans un Int32. Les valeurs de la propriété de durée de vie qui ne sont pas conformes à ces spécifications sont autorisées mais ne sont pas traitées comme une valeur de durée de vie du document explicite.

La valeur de durée de vie pour le document est facultative. Les documents sans valeur de durée de vie peuvent être insérés dans la collection. Dans ce cas, la valeur de durée de vie de la collection est respectée.

Les documents suivants ont des valeurs de durée de vie valides. Une fois que les documents sont insérés, les valeurs de durée de vie des documents remplacent les valeurs de durée de vie de la collection. Par conséquent, les documents seront supprimés après 20 secondes.

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)}) 

Les documents suivants ont des valeurs de durée de vie non valides. Les documents sont insérés, mais la valeur de durée de vie du document n’est pas respectée. Par conséquent, les documents seront supprimés après 10 secondes en raison de la valeur de durée de vie de la collection.

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). 

Étape suivante