部分インデックス - Amazon DocumentDB

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

部分インデックス

部分インデックスは、特定のフィルター基準を満たすコレクション内のドキュメントをインデックス化します。部分インデックス機能は、Amazon DocumentDB 5.0 インスタンスベースのクラスターでサポートされています。

部分インデックスを作成する

部分インデックスを作成するには、partialFilterExpression オプションで createIndex() メソッドを使用します。例えば、次のオペレーションでは、OrderID を持ち、かつ isDelivered フィールドが true であるドキュメントをインデックス化する一意の複合インデックスを注文コレクションに作成します。

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

サポートされている演算子

  • $eq

  • $exists

  • $and (最上位のみ)

  • $gt/$gte/$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()
注記

クエリプランナーは、効率的に望ましい場合には、インデックススキャンではなくコレクションスキャンを使用することがあります。これは通常、コレクションの大部分を返す、非常に小さなコレクションまたはクエリに使用されます。

部分インデックス機能

部分インデックスを一覧表示する

getIndex オペレーションを使用して、partialFilterExpression を含む部分インデックスを一覧表示します。例えば、getIndex オペレーションは、キー、名前、および partialfilterExpressions フィールドを含む部分インデックスを一覧表示します。

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}} ] } } ]

同じキー: 順序の複数の部分フィルター式

同じフィールドの組み合わせ (キー:順序) に対して異なる部分インデックスを作成できます。これらのインデックスには別の名前が必要です。

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 プロパティを持つインデックス

インデックスの作成時に partialFilterExpressionexpireAfterSeconds の両方のオプションを指定することで、部分プロパティと 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 の執行にも使用できません。

    次の例では、partialFilterExpressionfield1 にのみ適用され、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 はサポートされていません。次の演算はエラーを生じます。

    db.orders.createIndex( {"CustomerId":1}, {'partialFilterExpression': {'OrderId': {'$eq': [1000, 1001, 1002]}}} )
  • partialFilterExpression フィールドでは、次の演算子はサポートされていません。

    • $all (配列演算子)

    • $mod (配列演算子)

    • $or

    • $xor

    • $not

    • $nor

  • フィルター式とフィルターのデータ型は同じである必要があります。