Indeks sebagian - Amazon DocumentDB

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Indeks sebagian

Indeks sebagian mengindeks dokumen dalam koleksi yang memenuhi kriteria filter tertentu. Fitur indeks sebagian didukung di kluster berbasis instans Amazon DocumentDB 5.0.

Buat indeks sebagian

Untuk membuat indeks sebagian, gunakan createIndex() metode dengan partialFilterExpression opsi. Misalnya, operasi berikut membuat indeks gabungan unik dalam koleksi pesanan yang mengindeks dokumen yang memiliki OrderID dan memiliki isDelivered bidang sebagai true:

db.orders.createIndex( {"category": 1, "CustomerId": 1, "OrderId": 1}, {"unique": true, "partialFilterExpression": {"$and": [ {"OrderId": {"$exists": true}}, {"isDelivered": {"$eq": false}} ]} } )

Operator yang didukung

  • $ eq

  • $ ada

  • $ dan (hanya di tingkat atas)

  • $gt/$gte/$lt/$lte (pemindaian indeks hanya digunakan ketika filter, diprediksikan dalam kueri, cocok dengan ekspresi filter sebagian persis) (Lihat Batasan)

Kueri menggunakan indeks paral

Pola kueri berikut dimungkinkan menggunakan indeks sebagian:

  • Predikat kueri sama persis dengan ekspresi filter indeks sebagian:

    db.orders.find({"$and": [ {"OrderId": {"$exists": true}}, {"isDelivered": {"$eq": false}} ]}).explain()
  • Hasil yang diharapkan filter kueri adalah subset logis dari filter paral:

    db.orders.find({"$and": [ {"OrderId": {"$exists": true}}, {"isDelivered": {"$eq": false}}, {"OrderAmount": {"$eq": "5"}} ]}).explain()
  • Sub-predikat kueri dapat digunakan bersama dengan indeks lain:

    db.orders.createIndex({"anotherIndex":1}) db.orders.find({ "$or": [ {"$and": [ {"OrderId": {"$exists": true}}, {"isDelivered": {"$eq": false}} ]}, {"anotherIndex": {"$eq": 5}} ] }).explain()
catatan

Perencana kueri dapat memilih untuk menggunakan pemindaian koleksi daripada pemindaian indeks jika efisien untuk melakukannya. Ini biasanya terlihat untuk koleksi atau kueri yang sangat kecil yang akan mengembalikan sebagian besar koleksi.

Fungsionalitas indeks sebagian

Daftar indeks sebagian

Buat daftar indeks sebagian dengan partialFilterExpression menggunakan getIndex operasi. Misalnya, getIndex operasi yang dikeluarkan dalam mencantumkan indeks sebagian dengan bidang kunci, nama, dan partialFilterExpressions:

db.orders.getIndexes()

Contoh ini mengembalikan output sebagai berikut:

[ { "v" : 4, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "ecommerceApp.orders" }, { "v" : 4, "unique" : true, "key" : { "category" : 1, "" : 1, "CustomerId" : 1, "OrderId" : 1 }, "name" : "category_1_CustID_1_OrderId_1", "ns" : "ecommerceApp.orders", "partialFilterExpression" : { "$and" : [ {"OrderId": {"$exists": true}}, {"isDelivered": {"$eq": false}} ] } } ]

Beberapa ekspresi filter paral pada kunci yang sama: urutan

Indeks paral yang berbeda dapat dibuat untuk kombinasi bidang yang sama (key:order). Indeks ini harus memiliki nama yang berbeda.

db.orders.createIndex( {"OrderId":1}, { name:"firstPartialIndex", partialFilterExpression:{"OrderId":{"$exists": true}} } )
db.orders.createIndex( {"OrderId":1}, { name:"secondPartialIndex", partialFilterExpression:{"OrderId":{"$gt": 1000}} } )

Jalankan getIndexes operasi untuk mencantumkan semua indeks dalam koleksi:

db.orders.getIndexes()

Contoh-contoh ini mengembalikan output berikut:

[ { "v" : 4, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "ecommerceApp.orders" }, { "v" : 4, "key" : { "OrderId" : 1 }, "name" : "firstPartialIndex", "ns" : "ecommerceApp.orders", "partialFilterExpression" : {"OrderId":{"$exists": true}} }, { "v" : 4, "key" : { "OrderId" : 1 }, "name" : "secondPartialIndex", "ns" : "ecommerceApp.orders", "partialFilterExpression" : {"OrderId":{"$gt": 1000}} } ]
penting

Nama indeks harus berbeda dan harus dihapus dengan nama saja.

Indeks dengan properti parsi dan TTL

Anda juga dapat membuat indeks yang memiliki properti parsi dan TTL dengan menentukan keduanya partialFilterExpression dan expireAfterSeconds opsi selama pembuatan indeks. Ini memungkinkan Anda untuk memberikan kontrol lebih besar atas dokumen mana yang sekarang dihapus dari koleksi.

Misalnya, Anda mungkin memiliki indeks TTL yang mengidentifikasi dokumen yang akan dihapus setelah jangka waktu tertentu. Anda sekarang dapat memberikan ketentuan tambahan tentang kapan harus menghapus dokumen menggunakan opsi indeks sebagian:

db.orders.createIndex( { "OrderTimestamp": 1 }, { expireAfterSeconds: 3600 , partialFilterExpression: { "isDelivered": { $eq: true } } } )

Contoh ini mengembalikan output sebagai berikut:

{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1, "operationTime" : Timestamp(1234567890, 1) }

Jalankan getIndexes operasi untuk mencantumkan indeks yang ada dalam koleksi:

db.orders.getIndexes() [ { "v" : 4, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "test.orders" }

Contoh ini mengembalikan output sebagai berikut:

[ { "v": 4, "key": { "_id": 1 }, "name": "_id_", "ns": "ecommerceApp.orders" }, { "v": 4, "key": { "OrderTimestamp": 1 }, "name": "OrderTimestamp_1", "ns": "ecommerceApp.orders", "partialFilterExpression": { "isDelivered": { "$eq": true } }, "expireAfterSeconds": 3600 } ]

Keterbatasan indeks sebagian

Batasan berikut berlaku untuk fitur indeks sebagian:

  • Kueri ketidaksetaraan di Amazon DocumentDB hanya akan menggunakan indeks sebagian ketika predikat filter kueri sama persis dengan dan memiliki tipe data partialFilterExpression yang sama.

    catatan

    Bahkan $hint tidak dapat digunakan untuk memaksa IXSCAN untuk kasus di atas.

    Dalam contoh berikut, hanya partialFilterExpression diterapkan pada field1 tetapi tidakfield2:

    db.orders.createIndex( {"OrderAmount": 1}, {"partialFilterExpression": { OrderAmount : {"$gt" : 5}}} ) db.orders.find({OrderAmount : {"$gt" : 5}}) // Will use partial index db.orders.find({OrderAmount : {"$gt" : 6}}) // Will not use partial index db.orders.find({OrderAmount : {"$gt" : Decimal128(5.00)}}) // Will not use partial index
  • A partialFilterExpression dengan operator array tidak didukung. Operasi berikut akan menghasilkan kesalahan:

    db.orders.createIndex( {"CustomerId":1}, {'partialFilterExpression': {'OrderId': {'$eq': [1000, 1001, 1002]}}} )
  • Operator berikut tidak didukung di partialFilterExpression lapangan:

    • $all(operator array)

    • $mod(operator array)

    • $or

    • $xor

    • $not

    • $nor

  • Tipe data dari ekspresi filter dan filter harus sama.