2016-05-31 8 views
0

私は採用しようとしているクエリのインデックス(またはインデックス)が何であるかについて少し混乱しています。このクエリは一意ではありませんが、クエリがどのように表示されるかの要点になります。私は値をプレースホルダに置き換えたので、多くの意味がないかもしれません。最後にソートする必要もあります。mongodb - クエリに基づいて複合インデックスを作成しようとしています

{ oId: 1, 
 
    status: { '$in': [ 'STATUS1', 'STATUS2' ] }, 
 
    '$and': 
 
    [ { '$or': 
 
     [ { '$or': 
 
      [ { prov: 'P1', 
 
       '$or': [ { tags: { '$in': [ 'tag1' ] } } ] }, 
 
       { prov: 'P2', 
 
       '$or': [ { tags: { '$in': [ 'tag1' ] } } ] }, 
 
       { prov: 'P3', 
 
       '$or': [ { tags: { '$in': [ 'tag1' ] } } ] }, 
 
       { prov: 'P4', 
 
       '$or': [ { tags: { '$in': [ 'tag1' ] } } ] } ] }, 
 
      { '$or': 
 
      [ { prov: 'P1', 
 
       login: { '$in': [ 'login1' ] } }, 
 
       { prov: 'P2', 
 
       login: { '$in': [ 'login2' ] } }, 
 
       { prov: 'P3', 
 
       login: { '$in': [ 'login1' ] } }, 
 
       { prov: 'P3', 
 
       login: { '$in': [ 'login3' ] } } ] }, 
 
      { '$or': 
 
      [ { prov: 'P3', 
 
       group: { '$in': [ 'group1' ] } } ] }, 
 
      { '$or': 
 
      [ { prov: 'P2', 
 
       locationId: { '$in': [ '1', '2' ] } } ] } ] }, 
 
    { '$or': 
 
     [ { prov: 'P1', 
 
      '$or': 
 
      [ { group: 'group2' }, 
 
       { login: 'login5' } ] }, 
 
      { prov: 'P2', 
 
      '$or': 
 
      [ { group: 'group3' }, 
 
       { login: 'login3' } ] }, 
 
      { prov: 'P3', 
 
      '$or': [ { login: 'login3' } ] }, 
 
      { prov: 'P4', 
 
      '$or': [ { login: 'login3' } ] } ] } ] }, {sort: {createdAt: -1}}

例文書は次のようになります。

{ 
    oId: 1, 
    login: 'login1', 
    locationId: 2, 
    prov: 'P1', 
    status: 'STATUS1', 
    group: 'group1', 
    createdAt: <DateTime>, 
    tags: ['tag1', 'tag2'] 
} 

私はフィールドの数が少ない上に形成する方法化合物インデックスの原理を理解し、まだそれは私のように思えます私が自分の場合にどのように達成するのかを本当に理解していない。

もちろん、どんな入力も高く評価されています。

答えて

1

私はこのようなインデックスを作成します。

{OID:1、ステータス:-1、PROV:-1、ログイン:-1、locationId:-1、createdAt:-1、グループ:-1、タグ:-1}

よう複合インデックスが重要なのは第1の選択肢です。インデックスの残りの部分の任意の組み合わせと順序を使用するもの。インデックスを使用します。単純なインデックスで変更される唯一の部分は、ソート順が複合インデックスで変更できないことです。

幸運。

+0

興味深い。私はこれを試しましたが、複合インデックス(〜2500ms)とは対照的に、単純な1フィールドインデックス({ownerId: 'hashed'}〜120ms)でクエリがうまく実行されるようです。 – nainy

+0

は 'ownerId'ではなく' oId'を意味しました。申し訳ありません – nainy

+1

hmm。照会しているコレクション内の文書はいくつありますか? –

関連する問題