部分インデックス - 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}} ] } } ]

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

同じフィールドの組み合わせ (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と完全に一致し、同じデータ型の場合にのみ、部分インデックスを使用します。

    注記

    上記のケースで IXSCAN を強制$hintするためにも使用できます。

    次の例では、 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を持つ はサポートされていません。次のオペレーションではエラーが発生します。

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

    • $all (配列演算子)

    • $mod (配列演算子)

    • $or

    • $xor

    • $not

    • $nor

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