Завершение срока действия данных с помощью API Azure Cosmos DB для MongoDB
Область применения: MongoDB
Функция срока жизни позволяет автоматически прекращать хранение данных в базе данных. API Azure Cosmos DB для MongoDB использует основные возможности TTL Azure Cosmos DB. Поддерживаются два режима: установка срока жизни по умолчанию для всей коллекции и выбор отдельных значений срока жизни для каждого документа. Логика, управляющая индексами TTL и значениями TTL для каждого документа в API Azure Cosmos DB для MongoDB, совпадает с azure Cosmos DB.
Индексы срока жизни
Чтобы установить срок жизни для всей коллекции, нужно создать индекс срока жизни. Это индекс для поля _ts
со значением expireAfterSeconds.
Пример для MongoShell:
globaldb:PRIMARY> db.coll.createIndex({"_ts":1}, {expireAfterSeconds: 10})
С помощью приведенной выше команды создается индекс с функцией срока жизни.
Выходные данные команды включают различные метаданные:
{
"_t" : "CreateIndexesResponse",
"ok" : 1,
"createdCollectionAutomatically" : true,
"numIndexesBefore" : 1,
"numIndexesAfter" : 4
}
После создания индекса база данных автоматически удаляет все документы в этой коллекции, которые не были изменены за последние 10 секунд.
Примечание.
_ts
— это поле для Конкретной базы данных Azure Cosmos DB и недоступно для клиентов MongoDB. Это зарезервированное (системное) свойство, содержащее метку времени последнего изменения документа.
Пример на Java:
MongoCollection collection = mongoDB.getCollection("collectionName");
String index = collection.createIndex(Indexes.ascending("_ts"),
new IndexOptions().expireAfter(10L, TimeUnit.SECONDS));
Пример на 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);
Установка срока жизни для документа
Также есть возможность установить срок жизни для документа. Документы должны содержать свойство ttl (в нижнем регистре) корневого уровня. Кроме того, для коллекции нужно создать индекс срока жизни, как описано выше. Значения TTL, заданные в документе, переопределяют значение TTL коллекции.
Значение срока жизни должно быть типа int32, значением типа int64, которое помещается в значение типа int32 либо значением double без десятичной части, которое помещается в значение типа int32. Значения свойства TTL, которые не соответствуют этим спецификациям, разрешены, но не рассматриваются как понятное значение TTL документа.
Значение срока жизни для документа является необязательным. В коллекцию можно вставлять и документы без значения срока жизни. В этом случае значение TTL коллекции учитывается.
Для указанных ниже документов заданы допустимые значения срока жизни. После вставки документов значения их срока жизни переопределяют значение срока жизни для коллекции. Следовательно, документы будут удалены через 20 секунд.
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)})
Для указанных ниже документов заданы недопустимые значения срока жизни. Документы вставляются, но значение TTL документа не будет считаться. Следовательно, документы будут удалены через 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).