2017-01-19 7 views
0

コレクションインデックスを正しく設定しようとしています。私のようにそれをインデックス化していますMongo - クエリに一致するインデックスがありません

// videos collection 
{ 
    _id: idString, 
    ts: date, 
    owner_id: idString, 
    published: boolean, 
    readyToPlay: boolean, 
    private: boolean, 
    deleted: boolean, 
} 

:私はのようなものですコレクションしまし

videos.ensureIndex({ 
    owner_id: 1, 
    deleted: 1, 

    published: 1, 
    readyToPlay: 1, 
    private: 1, 

    ts: -1, 
}) 

を、私はそれが好きで照会しています:私が説明してるとき

videos.find({ 
    owner_id: { $in: ids }, 
    deleted: false, 
    published: true, 
    private: false, 
    readyToPlay: true, 
}) 

クエリ:取得:

[ { 
    queryPlanner: { 
    plannerVersion: 1, 
    namespace: 'videos', 
    indexFilterSet: false, 
    parsedQuery: { '$and': [ 
     { isPrivate: { '$eq': false } }, 
     { published: { '$eq': true } }, 
     { readyToPlay: { '$eq': true } }, 
     { owner_id: { '$in': [...] } }, 
     { deleted: { '$eq': false } }, 
    ] }, 
    winningPlan: [...], 
    rejectedPlans: [], 
    }, 
    executionStats: { 
    nReturned: some docs, 
    totalDocsExamined: all the docs, 
    ... 
    }, 
    serverInfo: { ... }, 
] 

以降がfalseの場合、インデックスが正常に動作していないようです。私はそれをどのように変更すべきですか?

受賞計画は次のとおりです。

{ stage: 'FETCH', 
    inputStage: { 
    stage: 'SORT_MERGE', 
    sortPattern: { ts: 1 }, 
    inputStages: [{ 
     stage: 'IXSCAN', 
     keyPattern: { 
     owner_id: 1, 
     deleted: 1, 
     published: 1, 
     readyToPlay: 1, 
     isPrivate: 1, 
     ts: -1 
     }, 
     indexName: 'owner_id_1_deleted_1_published_1_readyToPlay_1_isPrivate_1_ts_-1', 
     isMultiKey: false, 
     isUnique: false, 
     isSparse: false, 
     isPartial: false, 
     indexVersion: 1, 
     direction: 'backward', 
     indexBounds: { owner_id: [ '["id1", "id1"]' ], 
     deleted: [ '[false, false]' ], 
     published: [ '[true, true]' ], 
     readyToPlay: [ '[true, true]' ], 
     isPrivate: [ '[false, false]' ], 
     ts: [ '[MinKey, MaxKey]' ] 
     } 
    }, 
    // a lot more stages, one for each key in ids 
    ] 
    } 
} 
+0

これはどの言語ですか? – J3STER

+0

コレクションに多数のレコードがない場合は、インデックス検索の代わりにフルテーブルスキャンを行うほうが安価です – RickyA

答えて

1

あなたのインデックスが使用されています。 winningPlanexecutionStatsセクションを探してください。ここに私が持っているものがあります:

"winningPlan" : { 
    "stage" : "FETCH", 
    "inputStage" : { 
      "stage" : "IXSCAN", 
      "keyPattern" : { 
        "owner_id" : 1, 
        "deleted" : 1, 
        "published" : 1, 
        "readyToPlay" : 1, 
        "private" : 1, 
        "ts" : -1 
      }, 
      "indexName" : "owner_id_1_deleted_1_published_1_readyToPlay_1_private_1_ts_-1", 
      "isMultiKey" : false, 
      "isUnique" : false, 
      "isSparse" : false, 
      "isPartial" : false, 
      "indexVersion" : 1, 
      "direction" : "forward", 
      "indexBounds" : { 
        "owner_id" : [ 
          "[\"1\", \"1\"]" 
        ], 
        "deleted" : [ 
          "[false, false]" 
        ], 
        "published" : [ 
          "[true, true]" 
        ], 
        "readyToPlay" : [ 
          "[true, true]" 
        ], 
        "private" : [ 
          "[true, true]" 
        ], 
        "ts" : [ 
          "[MaxKey, MinKey]" 
        ] 
      } 
    } 

インデックススキャンがあります。

+0

ありがとうございます。私が得た勝利の計画を追加しました。まったく同じではありませんが、インデックスを使用していることを示唆していますか? – Guig

+0

はい、入力ステージは明示的に 'IXSCAN'を示します。インデックスが使用されていない場合は、 'COLLSCAN' – ares

関連する問題