http://docs.mongodb.org/manual/core/indexes/#multikey-indexesから、マルチキーインデックスを使用して配列フィールドにインデックスを作成することは可能です。 http://docs.mongodb.org/manual/applications/aggregation/#pipeline-operators-and-indexesは、集約フレームワークでどのようにインデックスを使用できるかをいくつか示しています。ただし、配列フィールドに$unwind
を実行して$group
を実行する必要がある場合があります。私の質問は、マルチキーインデックス(またはそのような配列フィールドを使用するインデックス)は、パイプラインの途中で操作された後も使用できるかどうかです。集約パイプラインとインデックス
答えて
一般的に、通常のクエリ($match
、$limit
、$sort
、および$skip
)に平坦化することができる唯一のパイプライン演算子は、コレクションのインデックスを使用することができます。これは、2.4で追加された$geoNear
演算子がパイプラインの先頭になければならない理由の1つです。
$project
、$group
、または$unwind
を使用してドキュメントを変更すると、インデックスは有効でなくなりました。
$unwind
の前に配列フィールドにインデックスを残しておくと、パイプライン化するドキュメントの選択を高速化し、選択したドキュメントを2番目の$match
でさらに細分化することができます。 tags
のインデックスで
{ tags: [ 'cat', 'bird', 'blue' ] }
:
のような文書を考えてみましょう。
あなただけb
で始まるグループにタグを望んでいたなら、あなたは次のように集約を行うことができます:
{ pipeline: [
{ $match : { tags : /^b/ } },
{ $unwind : '$tags' },
{ $match : { tags : /^b/ } },
/* the rest */
] }
最初$match
tags
にインデックスを使用して粗粒の試合を行います。
$unwind
の後の2番目のマッチではインデックスを使用できません(上記のドキュメントは3つのドキュメントになりましたが、これらのドキュメントのそれぞれを評価して、 'cat'}を入力します)。
HTH - Rob。
うーん@Robが正しい答えを与えるが、私は彼が少し間違った道をあなたを導く可能性がどのように見てい:
あなたは、配列のフィールドにインデックスを持っている場合、あなたはまだ前と後にそれを使用することができますパイプラインするドキュメントの選択をスピードアップし、次に選択されたドキュメントをさらに細かく調整するために$ unwindを使用します。
基本的に彼が与える例:
{ pipeline: [
{ $match : { tags : /^b/ } },
{ $unwind : '$tags' },
{ $match : { tags : /^b/ } },
/* the rest */
] }
は$unwind
過ぎマルチキーインデックスを使用しません。したがって、b
で始まるタグ名を持つすべてのROOTドキュメントを検索することはできますが、$unwind
にはアクセスできず、インデックスを使用して2番目の$match
にサブ文書をフィルタリングできます。
$match
は、突然変異の前のインデックスでのみ機能します。
基本的にドキュメントを突き詰めてパイプラインにロードすると、現時点でインデックスを使用することはほとんど不可能になります。
- 1. MongoDBのパイプライン集約パイプライン値
- 2. MongoDB集約パイプライン$ project
- 3. MongoDB集約パイプラインの問題
- 4. MongoDB一致インデックスvsインデックスなし - 集約
- 5. MongoDBの集約パイプラインPHP - 私は私の集約パイプラインでこのようなサブアレイ構造を有するサブアレー
- 6. Cap'n Protoと約束のパイプライン
- 7. mongo集約パイプラインでSQLサブクエリを実装する方法は?
- 8. 集約パイプラインで$ sizeを使用するには?
- 9. コスモスDBのMongo DB集約パイプラインをコードで有効にする
- 10. Elasticsearchソート条件パイプラインbucket_script集約によって
- 11. MongoDB集約パイプラインで文書全体を参照する
- 12. MongoDB:集約パイプラインの配列の要素にインデックス名を割り当てる方法は?
- 13. ネゴシエートされた埋め込みドキュメントと$ projectを使ったMongo集約パイプライン$ルックアップ
- 14. pysparkサブストリングと集約
- 15. DDD、集約とエンティティ
- 16. マスクと集約ビット
- 17. Javascriptを:集約と
- 18. SAPUI5子集約の親集約のXMLView集約バインディングパス
- 19. bucket_selector-パイプライン集計の_bucket_count
- 20. MongoDB - 集約2集
- 21. フィルター集約内の基数集約
- 22. cakephpの集約可能な集約クエリ
- 23. 集約プロセッサーまたは集約リーダー
- 24. 他の集約クエリ内の集約サブクエリ
- 25. 集約
- 26. 集約
- 27. 集約
- 28. mongodbでコレクション全体の集約パイプライン演算子を適用する方法
- 29. 条件文と集約
- 30. PHP MongoDBのドライバと集約
答えをありがとう。しかし、私は "あなたが一度ドキュメントを変更すると、$ unwind'インデックスはもはや有効ではありません"答えの残りの部分と矛盾しています。なぜそういうのか説明できますか? – MervS
申し訳ありませんが、より明確になっているはずです。私は2番目にそれを編集しようとしますが、最初の試合ではインデックスを使用し、2番目の試合ではインデックスを使用しません。 –