適用対象:
MongoDB
Time to Live (TTL) 機能により、データベースはデータを自動的に期限切れにすることができます。 Azure Cosmos DB for MongoDB は、Azure Cosmos DB のコア TTL 機能を利用します。 コレクション全体に既定の TTL 値を設定するモードと、ドキュメントごとに個別の TTL 値を設定するモードの 2 つのモードがサポートされています。 MongoDB 用 Azure Cosmos DB の TTL インデックスとドキュメントごとの TTL 値を管理するロジックは、 Azure Cosmos DB の場合と同じです。
TTL インデックス
コレクション全体に対して TTL を有効にするには、"TTL インデックス" (Time to Live インデックス) を作成する必要があります。 TTL インデックスは、"expireAfterSeconds" 値を含む _ts
フィールドのインデックスです。
MongoShell の例:
globaldb:PRIMARY> db.coll.createIndex({"_ts":1}, {expireAfterSeconds: 10})
前の例のコマンドは、TTL 機能を持つインデックスを作成します。
コマンドの出力には、さまざまなメタデータが含まれています。
{
"_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);
ドキュメントの Time to Live 値の設定
ドキュメントごとの TTL 値もサポートされています。 1 つ以上のドキュメントにルート レベルのプロパティ "ttl" (小文字) が含まれている必要があり、前述の TTL インデックスがそのコレクションに対して作成されている必要があります。 ドキュメントに設定された TTL 値は、コレクションの TTL 値をオーバーライドします。
TTL 値は int32 である必要があります。 または、int32 に収まる int64、あるいは int32 に収まる小数部を持たない double を指定します。 これらの仕様に準拠していない TTL プロパティ値を使用することもできますが、ドキュメントの有効な TTL 値としては扱われません。
ドキュメントの TTL 値は省略可能です。TTL 値のないドキュメントをコレクションに挿入できます。 この場合、コレクションの TTL 値が適用されます。
次のドキュメントには有効な 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 値があります。 ドキュメントは挿入されますが、ドキュメントの TTL 値は適用されません。 そのため、コレクションの 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).