2017-02-02 1 views
1

Ich benutze ein Sharked Replica Set. Haben eine große Sammlung mit folgendem Index:Verwendet Mongo 3.4 Indizes für diese Abfrage oder nicht?

{ 
    "shop" : 1, 
    "email" : 1 
} 

Ich versuche, die beste Art der Abfrage jedes Element einzeln zu finden:

db.user.explain('executionStats').find({shop:151, email:{$exists:true}}, {limit:1})) 

und die Ergebnisse sind die folgenden.

Meine Fragen sind: Ist die Abfrage mit dem Index? Wenn ja, wie kann ich davon lesen erklären Ergebnis?

Zweitens: besser ist, diese Abfrage zu verwenden, Schleife der Cursor, dann abfragen wieder

.find ({shop: 151, E-Mail: {$ existiert: true}}, {Limit: 100}))

oder

.findOne ({shop: 151, E-Mail: {$ existiert: true}}))

in einer Endlosschleife?

{ 
"queryPlanner" : { 
    "plannerVersion" : NumberInt(1), 
    "namespace" : "vt4users.user", 
    "indexFilterSet" : false, 
    "parsedQuery" : { 
     "$and" : [ 
      { 
       "shop" : { 
        "$eq" : NumberInt(151) 
       } 
      }, 
      { 
       "email" : { 
        "$exists" : true 
       } 
      } 
     ] 
    }, 
    "winningPlan" : { 
     "stage" : "PROJECTION", 
     "transformBy" : { 
      "limit" : NumberInt(1) 
     }, 
     "inputStage" : { 
      "stage" : "FETCH", 
      "filter" : { 
       "email" : { 
        "$exists" : true 
       } 
      }, 
      "inputStage" : { 
       "stage" : "IXSCAN", 
       "keyPattern" : { 
        "shop" : NumberInt(1), 
        "email" : NumberInt(1) 
       }, 
       "indexName" : "shop_1_email_1", 
       "isMultiKey" : false, 
       "isUnique" : false, 
       "isSparse" : true, 
       "isPartial" : false, 
       "indexVersion" : NumberInt(1), 
       "direction" : "forward", 
       "indexBounds" : { 
        "shop" : [ 
         "[151.0, 151.0]" 
        ], 
        "email" : [ 
         "[MinKey, MaxKey]" 
        ] 
       } 
      } 
     } 
    }, 
    "rejectedPlans" : [ 

    ] 
}, 
"executionStats" : { 
    "executionSuccess" : true, 
    "nReturned" : NumberInt(3), 
    "executionTimeMillis" : NumberInt(0), 
    "totalKeysExamined" : NumberInt(3), 
    "totalDocsExamined" : NumberInt(3), 
    "executionStages" : { 
     "stage" : "PROJECTION", 
     "nReturned" : NumberInt(3), 
     "executionTimeMillisEstimate" : NumberInt(0), 
     "works" : NumberInt(4), 
     "advanced" : NumberInt(3), 
     "needTime" : NumberInt(0), 
     "needYield" : NumberInt(0), 
     "saveState" : NumberInt(0), 
     "restoreState" : NumberInt(0), 
     "isEOF" : NumberInt(1), 
     "invalidates" : NumberInt(0), 
     "transformBy" : { 
      "limit" : NumberInt(1) 
     }, 
     "inputStage" : { 
      "stage" : "FETCH", 
      "filter" : { 
       "email" : { 
        "$exists" : true 
       } 
      }, 
      "nReturned" : NumberInt(3), 
      "executionTimeMillisEstimate" : NumberInt(0), 
      "works" : NumberInt(4), 
      "advanced" : NumberInt(3), 
      "needTime" : NumberInt(0), 
      "needYield" : NumberInt(0), 
      "saveState" : NumberInt(0), 
      "restoreState" : NumberInt(0), 
      "isEOF" : NumberInt(1), 
      "invalidates" : NumberInt(0), 
      "docsExamined" : NumberInt(3), 
      "alreadyHasObj" : NumberInt(0), 
      "inputStage" : { 
       "stage" : "IXSCAN", 
       "nReturned" : NumberInt(3), 
       "executionTimeMillisEstimate" : NumberInt(0), 
       "works" : NumberInt(4), 
       "advanced" : NumberInt(3), 
       "needTime" : NumberInt(0), 
       "needYield" : NumberInt(0), 
       "saveState" : NumberInt(0), 
       "restoreState" : NumberInt(0), 
       "isEOF" : NumberInt(1), 
       "invalidates" : NumberInt(0), 
       "keyPattern" : { 
        "shop" : NumberInt(1), 
        "email" : NumberInt(1) 
       }, 
       "indexName" : "shop_1_email_1", 
       "isMultiKey" : false, 
       "isUnique" : false, 
       "isSparse" : true, 
       "isPartial" : false, 
       "indexVersion" : NumberInt(1), 
       "direction" : "forward", 
       "indexBounds" : { 
        "shop" : [ 
         "[151.0, 151.0]" 
        ], 
        "email" : [ 
         "[MinKey, MaxKey]" 
        ] 
       }, 
       "keysExamined" : NumberInt(3), 
       "dupsTested" : NumberInt(0), 
       "dupsDropped" : NumberInt(0), 
       "seenInvalidated" : NumberInt(0) 
      } 
     } 
    } 
}, 
"serverInfo" : { 
    "host" : "host", 
    "port" : NumberInt(27017), 
    "version" : "3.2.11", 
    "gitVersion" : "009580ad490190ba33d1c6253ebd8d91808923e4" 
}, 
"ok" : NumberInt(1) 

}

+0

Sie verwenden 3,2, nicht 3,4 wie im Titel der Frage. Es spielt jedoch keine Rolle. –

Antwort

1

Ihre Suche den Index verwendet. Sie können sehen, dass in der inputStage

"stage" : "IXSCAN" 

können Sie check it in the docs besser seine Bedeutung zu verstehen.

In Bezug auf Ihre zweite Frage, wenn Sie alle Ergebnisse abrufen möchten, ist das Schleifen mit findOne NICHT (leistungsmäßig) besser als die normale Ausführung der Abfrage.

+0

tatsächlich kopierte ich vom lokalen Mongo. Ist sowieso egal. –

+0

und in der Tat endete ich mit Limit statt find_one holen –