2017-01-19 4 views
0

Ich versuche, meine Collections-Indizes korrekt zu setzen. Ich habe eine Sammlung, die wie ist:Mongo - Abfrage stimmt nicht mit dem Index überein

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

ich es als Indizierung bin:

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

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

    ts: -1, 
}) 

und ich abfragt es mag:

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

Wenn ich erklären die Abfrage bekomme ich:

[ { 
    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: { ... }, 
] 

Seit indexFilterSet ist falsch, es scheint, dass mein Index nicht korrekt funktioniert. Wie sollte ich es ändern?

Der Gewinnplan ist:

{ 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

welche Sprache ist das? – J3STER

+0

Wenn es nicht zu viele Datensätze in einer Sammlung gibt, ist es auch günstiger, einen vollständigen Tabellenscan statt einer Indexsuche zu machen – RickyA

Antwort

1

Ihr Index verwendet wird. Sie sollten nach dem winningPlan und dem executionStats Abschnitt suchen. Hier ist, was ich habe:

"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]" 
        ] 
      } 
    } 

Sie sehen können, gibt es einen Index-Scan.

+0

Vielen Dank. Ich fügte den Siegerplan hinzu, den ich bekomme. Es ist nicht genau dasselbe, aber schlägt vor, dass es einen Index verwendet, oder? – Guig

+0

Ja, die Eingangsstufe gibt explizit 'IXSCAN' an. Wenn der Index nicht verwendet würde, hätte er "COLLSCAN" – ares

Verwandte Themen