部分索引 - Amazon DocumentDB

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

部分索引

部分索引會索引集合中符合指定篩選條件的文件。部分索引功能在 Amazon DocumentDB 5.0 執行個體型叢集中受支援。

創建一個部分索引

若要建立部分索引,請搭配partialFilterExpression選項使用該createIndex()方法。例如,下列作業會在 order 集合中建立唯一的複合索引,以索引具有OrderIDisDelivered欄位為 true 的文件:

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

支援的運算子

  • $eq

  • $exists

  • $ 和(僅在頂級)

  • $gt/$ gt/$lt/$lte (索引掃描僅在查詢中預測的篩選器完全符合部分篩選器運算式時才會使用) (請參閱限制)

使用部分索引進行查詢

使用部分索引可以使用以下查詢模式:

  • 查詢述詞完全符合部分索引篩選器運算式:

    db.orders.find({"$and": [ {"OrderId": {"$exists": true}}, {"isDelivered": {"$eq": false}} ]}).explain()
  • 查詢篩選器的預期結果是部分篩選器的邏輯子集:

    db.orders.find({"$and": [ {"OrderId": {"$exists": true}}, {"isDelivered": {"$eq": false}}, {"OrderAmount": {"$eq": "5"}} ]}).explain()
  • 查詢的子謂詞可以與其他索引一起使用:

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

如果有效率的話,查詢規劃工具可以選擇使用收集掃描而非索引掃描。對於非常小的集合或將返回集合的很大一部分的查詢,通常會出現這種情況。

部分索引功能

列出部分索引

partialFilterExpression 使用getIndex操作列出部分索引。例如,在中發出的getIndex作業會列出包含索引鍵、名稱和部分檔案解壓式欄位的部分索引:

db.orders.getIndexes()

此範例會傳回下列輸出:

[ { "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}} ] } } ]

同一鍵上的多個部分過濾器表達式:order

可以為相同的欄位組合 (key: order) 建立不同的部分索引。這些索引必須有不同的名稱。

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

運行getIndexes操作列出集合中的所有索引:

db.orders.getIndexes()

這些範例會傳回下列輸出:

[ { "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}} } ]
重要

索引名稱必須不同,並且只能按名稱刪除。

具有部分屬性和 TTL 屬性的索引

您也可以在建立索引期間指定和expireAfterSeconds選項,以建立具有部分屬性partialFilterExpression和 TTL 屬性的索引。這使您可以更好地控制哪些文檔現在從集合中刪除。

例如,您可能有一個 TTL 索引,用於識別在特定時間段後要刪除的文件。您現在可以針對何時使用部分索引選項來刪除文件提供額外條件:

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

此範例會傳回下列輸出:

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

運行getIndexes操作以列出集合中存在的索引:

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

此範例會傳回下列輸出:

[ { "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 } ]

部分索引限制

下列限制適用於部分索引功能:

  • Amazon DocumentDB 中的不等式查詢只會在查詢篩選器述詞完全符合partialFilterExpression和是相同的資料類型時,才會使用部分索引。

    注意

    對於上述情況,甚至$hint不能用於強制 IXSCAN。

    在下列範例中,只會partialFilterExpression套用至field1但不適用於field2

    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
  • 不支援partialFilterExpression帶有陣列運算子的 A。下列作業會產生錯誤:

    db.orders.createIndex( {"CustomerId":1}, {'partialFilterExpression': {'OrderId': {'$eq': [1000, 1001, 1002]}}} )
  • 欄位中不支援下列運算 partialFilterExpression 子:

    • $all(陣列運算子)

    • $mod(陣列運算子)

    • $or

    • $xor

    • $not

    • $nor

  • 篩選運算式和篩選器的資料類型應該是相同的。