3

レストラン用のmongo dbコレクションがあります。例: {_id: uniquemongoid, ランク: 3, 都市: 'ベルリン' }

  1. レストランは都市別に一覧表示され、ランク (整数) で並べられています。都市とランク、または都市とランクの組み合わせでインデックスを作成する必要がありますか? (私は都市でクエリを行い、ランクでソートします)

  2. さらに、{ hasParking:true, familyFriendly:true } などのブール値を持つフィールドがいくつかあります。これらのフィルターのクエリを高速化するには、インデックスを作成する必要がありますか? 複合インデックス? クエリにはブールセットを 1 つしか持たないか、複数のブールセットを持たせることができるため、複合インデックスを作成する必要があるかどうかは明確ではありません。

4

2 に答える 2

4

インデックスが必要かどうかを判断する最善の方法は、「explain()」でベンチマークすることです。

提案されたインデックスについては:

  1. 都市/ランクの複合インデックスが必要になります。MongoDB のインデックスは (現時点では) 左から右にしか使用できないため、"city" で等値検索を実行し、結果を "rank" で並べ替えると、{ city: 1, rank: -1 }インデックスが最適に機能することを意味します。

  2. 平均すると、MongoDB は依然としてドキュメントの半分にアクセスする必要があるため、ブール型フィールドのインデックスはあまり役に立ちません。都市による選択 (できれば制限も!) を行った後、hasParking などに対して追加のフィルターを実行しても、MongoDB が都市/ランクと hasParking インデックスの両方を使用することはありません。MongoDB は、クエリごとに 1 つのインデックスしか使用できません。

于 2013-07-11T10:35:39.713 に答える
2

1) 目的に役立つインデックス { restaurant:1, rank: 1} を作成します。

2 つのインデックスを避ける

2)次の形式でドキュメントを作成すると、必要なフィールドの数を照会できます。

{
    info: [{hasParking:true}, {familyFriendly:true}],
    _id:
    rank:
    city:
}
db.restaurants.ensureIndex({info : 1});
db.restaurants.find({ info :{ hasParking:true}})
  • 注 MongoDB は、同じクエリに対して 2 つのインデックスを使用しません ($or クエリを除く)。したがって、(2) の場合、(1) クエリに追加フィルターを追加する場合、この (2) オプションは機能しません。(2)の要件がわからないので、このソリューションを投稿してください。
于 2013-07-11T10:35:27.347 に答える