Gegevens automatisch laten verlopen met de Azure Cosmos DB-API voor MongoDB
VAN TOEPASSING OP: MongoDB
TTL-functionaliteit (Time-To-Live) is een voorziening om gegevens in een database automatisch te laten verlopen. De API van Azure Cosmos DB voor MongoDB maakt gebruik van de belangrijkste TTL-mogelijkheden van Azure Cosmos DB. Er worden twee modi ondersteund: het instellen van een standaard-TTL-waarde voor de hele verzameling en het instellen van afzonderlijke TTL-waarden voor elk document. De logica voor TTL-indexen en TTL-waarden per document in de API van Azure Cosmos DB voor MongoDB is hetzelfde als in Azure Cosmos DB.
TTL indexen
Als u TTL universeel wilt instellen voor een verzameling, moet u een TTL-index (Time-To-Live) maken. De TTL-index is een index in het _ts
veld met de waarde 'expireAfterSeconds'.
MongoShell-voorbeeld:
globaldb:PRIMARY> db.coll.createIndex({"_ts":1}, {expireAfterSeconds: 10})
Met de opdracht in het bovenstaande voorbeeld wordt een index met TTL-functionaliteit gemaakt.
De uitvoer van de opdracht bevat verschillende metagegevens:
{
"_t" : "CreateIndexesResponse",
"ok" : 1,
"createdCollectionAutomatically" : true,
"numIndexesBefore" : 1,
"numIndexesAfter" : 4
}
Zodra de index is gemaakt, verwijdert de database automatisch alle documenten in die verzameling die de afgelopen tien seconden niet zijn gewijzigd.
Notitie
_ts
is een azure Cosmos DB-specifiek veld en is niet toegankelijk vanaf MongoDB-clients. Het is een gereserveerde eigenschap (systeemeigenschap) met het tijdstempel van de laatste wijziging van het document.
Java-voorbeeld:
MongoCollection collection = mongoDB.getCollection("collectionName");
String index = collection.createIndex(Indexes.ascending("_ts"),
new IndexOptions().expireAfter(10L, TimeUnit.SECONDS));
C#-voorbeeld:
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);
TTL-waarde voor een document instellen
U kunt ook TTL-waarden per document instellen. Het document moet een eigenschap 'ttl' (kleine letters) op hoofdniveau bevatten en er moet voor deze verzameling een TTL-index zijn gemaakt zoals hierboven is beschreven. TTL-waarden die in een document zijn ingesteld, overschrijft de TTL-waarde van de verzameling.
De TTL-waarde moet van het type int32 zijn. Alternatieven zijn een int64 die past in een int32 of een double zonder cijfers achter het decimaalteken die past in een int32. Waarden voor de TTL-eigenschap die niet aan deze specificaties voldoen, worden toegestaan, maar worden niet behandeld als een zinvolle TTL-waarde voor documenten.
De TTL-waarde voor het document is optioneel. Er kunnen ook documenten zonder een TTL-waarde worden ingevoegd in de verzameling. In dit geval wordt de TTL-waarde van de verzameling gehonoreerd.
De volgende documenten hebben geldige TTL waarden. Zodra de documenten zijn ingevoegd, vervangen de TTL-waarden van het document de TTL-waarden van de verzameling. Dit houdt in dat de documenten na 20 seconden worden verwijderd.
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)})
De volgende documenten hebben ongeldige TTL waarden. De documenten worden ingevoegd, maar de TTL-waarde van het document wordt niet gehonoreerd. Dit betekent dat de documenten na tien seconden worden verwijderd omdat de TTL van de verzameling is ingesteld op 10.
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).