Kedaluwarsa data dengan API Azure Cosmos DB untuk MongoDB
BERLAKU UNTUK: MongoDB
Fungsionalitas Time-to-live (TTL) memungkinkan database secara otomatis kedaluwarsa data. API Azure Cosmos DB untuk MongoDB menggunakan kemampuan TTL inti Azure Cosmos DB. Dua mode didukung: mengatur nilai TTL default pada seluruh koleksi, dan mengatur nilai TTL individual untuk setiap dokumen. Logika yang mengatur indeks TTL dan nilai TTL per dokumen di API Azure Cosmos DB untuk MongoDB sama seperti di Azure Cosmos DB.
Indeks TTL
Untuk mengaktifkan TTL secara universal pada koleksi, "indeks TTL" (indeks time-to-live) perlu dibuat. Indeks TTL adalah indeks pada bidang _ts
dengan nilai "expireAfterSeconds".
Contoh MongoShell:
globaldb:PRIMARY> db.coll.createIndex({"_ts":1}, {expireAfterSeconds: 10})
Perintah dalam contoh di atas akan membuat indeks dengan fungsionalitas TTL.
Output dari perintah mencakup berbagai metadata:
{
"_t" : "CreateIndexesResponse",
"ok" : 1,
"createdCollectionAutomatically" : true,
"numIndexesBefore" : 1,
"numIndexesAfter" : 4
}
Setelah indeks dibuat, database akan secara otomatis menghapus dokumen apa pun dalam koleksi yang belum dimodifikasi dalam 10 detik terakhir.
Catatan
_ts
adalah bidang khusus Azure Cosmos DB dan tidak dapat diakses dari klien MongoDB. Bidang ini adalah properti (sistem) cadangan yang berisi tanda waktu modifikasi terakhir dokumen.
Contoh Java:
MongoCollection collection = mongoDB.getCollection("collectionName");
String index = collection.createIndex(Indexes.ascending("_ts"),
new IndexOptions().expireAfter(10L, TimeUnit.SECONDS));
Contoh 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);
Mengatur waktu untuk nilai hidup untuk dokumen
Nilai TTL per dokumen juga didukung. Dokumen harus berisi properti tingkat akar "ttl" (huruf kecil), dan indeks TTL seperti yang dijelaskan di atas harus dibuat untuk koleksi tersebut. Nilai TTL yang diatur pada dokumen mengambil alih nilai TTL koleksi.
Nilai TTL harus merupakan int32. Atau, int64 yang pas dalam int32, atau ganda tanpa bagian desimal yang pas dalam int32. Nilai untuk properti TTL yang tidak sesuai dengan spesifikasi ini diizinkan tetapi tidak diperlakukan sebagai nilai TTL dokumen yang bermakna.
Nilai TTL untuk dokumen bersifat opsional; dokumen tanpa nilai TTL dapat disisipkan ke dalam koleksi. Dalam hal ini, nilai TTL koleksi dihormati.
Dokumen berikut ini memiliki nilai TTL yang valid. Setelah dokumen disisipkan, nilai TTL dokumen akan menggantikan nilai TTL kumpulan. Jadi, dokumen akan dihapus setelah 20 detik.
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)})
Dokumen berikut ini memiliki nilai TTL yang tidak valid. Dokumen disisipkan, tetapi nilai TTL dokumen tidak akan dihormati. Jadi, dokumen akan dihapus setelah 10 detik karena nilai TTL koleksi.
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).