2016-06-17 14 views
1

私はMongoDBの初心者です。 バージョン3.2を使用しています。 MongoDBはクエリで1つのインデックスしか使用できない箇所がいくつかありますが、私が見つけた情報は少し古いと思われます。公式ドキュメントでは何も見つかりませんでした。MongoDB:複数の単一のインデックスまたは複合インデックスを使用する

私はこのフォームで500M製品〜のコレクションを持っている:私はカテゴリごとにすべての製品を見つけ、そして価格で、その後、格付けによってそれをソートする必要

{_id: ObjectId('574d92332a2b10d7618b4575'), title: A, category_id: ObjectId('574d92332a2b10d7618b4575'), price: 30.23, rating:5 }, 
{_id: ObjectId('574d92332a2b10d7618b4575'), title: B, category_id: ObjectId('574d92332a2b10d7618b4575'), price: 20.23, rating:3 }, 
{_id: ObjectId('574d92332a2b10d7618b4575'), title: C, category_id: ObjectId('574d92332a2b10d7618b4575'), price: 10.23, rating:4 } 

が、最終的なユーザーも望んですることができますそれを価格で直接並べ替えるだけです。

すべての単一のクエリにはcategory_idが渡される必要がありますが、それは大変です。

私は3つのインデックス:{category_id:1},{rating:1}および{price:1}を作成しました。

これらのクエリは高速です:カテゴリごと

最も高価な製品カテゴリごと db.products.find({category_id:ObjectId('574d92332a2b10d7618b4575')}).sort({price:-1})

ベスト製品カテゴリごと db.products.find({category_id:ObjectId('574d92332a2b10d7618b4575')}).sort({rating:-1})

最悪の製品 db.products.find({category_id:ObjectId('574d92332a2b10d7618b4575')}).sort({rating:1})

しかし、カテゴリごとにこのクエリが非常に遅いです

ベストの製品は、最も安い db.products.find({category_id:ObjectId('574d92332a2b10d7618b4575')}).sort({rating:-1, price:1})

あなたはどのインデックスが作成した、そしてなぜだろう、私だったら? 私はpriceratingだけを持つことはすべてのクエリがcategory_idを必要とするので、愚かであると考え始めているので、私のインデックスにはcategory_idが含まれていなければならないが、what confuses me is the last paragraph of the official doc about compound indexesが含まれている必要があります。

私はすでにread this whole section on the official page of MongoDBですが、私の特定の問題に対する答えは見つかりません。

答えて

1

クエリを満たすために複合インデックスを作成する必要があります。ほとんどの場合、クエリ用語とソート基準を含める必要があります。

あなたが言いたいと思う紛らわしい文章は、複数のソート基準がある場合に関係します。複合ソート。複合ソートがある場合、インデックスエントリの順序と方向の両方が重要です。単一の値でソートする場合は、インデックスの方向(1または-1、昇順または降順)は関係ありません。

詳細および例については、this SO questionを参照してください。もう一つの良いリソースはOptimizing Compound Indexesブログ記事です。

このような化合物の並べ替えを許可する必要があるかどうかを検討したい場合があります。たとえば、ほとんどの電子商取引サイトでは、評価や価格だけではなく両方で並べ替えるのが一般的です。

+0

大変助かりました。ありがとう – mattspain

関連する問題