2017-01-19 1 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: { ... }, 
] 

С indexFilterSet ложно, кажется, что мой индекс работает некорректно. Как мне его изменить?

Победный план:

{ 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

Ваш индекс используется. Вы должны искать winningPlan и раздел executionStats. Вот что я получил:

"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