Vypršení platnosti dat s využitím rozhraní API služby Azure Cosmos DB pro MongoDB.
PLATÍ PRO: MongoDB
Funkce TTL (Time to Live) umožňuje automatické vypršení platnosti dat v databázi. Rozhraní API služby Azure Cosmos DB pro MongoDB využívá základní možnosti TTL služby Azure Cosmos DB. Podporují se dva režimy: nastavení výchozí hodnoty TTL pro celou kolekci a nastavení hodnot TTL pro každý dokument zvlášť. Logika, která řídí indexy TTL a hodnoty TTL pro jednotlivé dokumenty v rozhraní API služby Azure Cosmos DB pro MongoDB, je stejná jako ve službě Azure Cosmos DB.
Indexy TTL
Pokud chcete v kolekci povolit všeobecnou hodnotu TTL, je potřeba vytvořit index TTL (Time to Live). Index TTL je index v _ts
poli s hodnotou expireAfterSeconds.
Příklad MongoShellu:
globaldb:PRIMARY> db.coll.createIndex({"_ts":1}, {expireAfterSeconds: 10})
Příkaz v předchozím příkladu vytvoří index s funkcí TTL.
Výstup příkazu obsahuje různá metadata:
{
"_t" : "CreateIndexesResponse",
"ok" : 1,
"createdCollectionAutomatically" : true,
"numIndexesBefore" : 1,
"numIndexesAfter" : 4
}
Po vytvoření indexu databáze automaticky odstraní všechny dokumenty v této kolekci, které nebyly změněny za posledních 10 sekund.
Poznámka:
_ts
je pole specifické pro službu Azure Cosmos DB a není přístupné z klientů MongoDB. Jedná se o vyhrazenou (systémovou) vlastnost obsahující časové razítko poslední úpravy dokumentu.
Příklad Javy:
MongoCollection collection = mongoDB.getCollection("collectionName");
String index = collection.createIndex(Indexes.ascending("_ts"),
new IndexOptions().expireAfter(10L, TimeUnit.SECONDS));
Příklad jazyka 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);
Nastavení hodnoty TTL pro dokument
Podporují se také hodnoty TTL pro jednotlivé dokumenty. Dokumenty musí obsahovat vlastnost ttl (malými písmeny) na kořenové úrovni a pro danou kolekci musí být vytvořený index TTL, jak je popsáno výše. Hodnoty TTL nastavené v dokumentu přepíší hodnotu TTL kolekce.
Hodnota TTL musí být typu int32. Případně to může být hodnota typu int64, která se vejde do typu int32, nebo typu double bez desetinné části, která se vejde do typu int32. Hodnoty pro vlastnost TTL, která nevyhovují těmto specifikacím, jsou povoleny, ale nejsou považovány za smysluplnou hodnotu TTL dokumentu.
Hodnota TTL pro dokument je volitelná – do kolekce je možné vkládat i dokumenty bez hodnoty TTL. V tomto případě je hodnota TTL kolekce dodržena.
Následující dokumenty mají platné hodnoty TTL. Po vložení dokumentů hodnoty TTL dokumentu přepíšou hodnoty TTL kolekce. Dokumenty se proto odeberou po 20 sekundách.
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)})
Následující dokumenty mají neplatné hodnoty TTL. Dokumenty se vloží, ale hodnota TTL dokumentu nebude dodržena. Dokumenty se proto kvůli hodnotě TTL kolekce odeberou po 10 sekundách.
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).