2017-02-02 13 views
1

Я использую установленный набор реплик. Есть одна большая коллекция со следующим индексом:Есть ли Mongo 3.4 с использованием индексов для этого запроса или нет?

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

Я пытаюсь найти лучший способ запросов каждого элемента один на один:

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

и результаты являются следующие.

Мои вопросы: Есть ли запрос с использованием индекса? Если да, то как я могу читать из этого , объясните результат?

Второе: лучше использовать этот запрос, зацикливание курсор, затем запрос снова

.find ({магазин: 151, адрес электронной почты: {$ существует: истинный}}, {предел: 100}))

или

.findOne ({магазин: 151, адрес электронной почты: {$ существует: истинно}}))

в непрерывном цикле?

{ 
"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

Вы используете 3.2, а не 3.4, как в заголовке вопроса. Это не имеет значения. –

ответ

1

Ваш запрос с использованием индекса. Вы можете видеть, что в inputStage

"stage" : "IXSCAN" 

Вы можете check it in the docs, чтобы лучше понять его смысл.

Что касается вашего второго вопроса, если вы хотите получить все результаты, то цикл с помощью findOne НЕ лучше (производительность мудрый), чем обычный запрос.

+0

Действительно, я скопировал из местного монго. В любом случае это не имеет значения. –

+0

И действительно, я закончил с лимитом вместо find_one –