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.
Topik
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 padafield1
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.