Mongodb

mongo解釋結果中的PROJECTION階段是什麼意思

  • August 24, 2017

我在 mongodb shell 的分片集群上執行解釋命令。stage從輸出中我看到第一個inputStagePROJECTION. 我不太明白這個階段是什麼意思。我在 mongodb 網站上找不到它。這個階段有定義嗎?

"winningPlan" : {
                       "stage" : "SUBPLAN",
                       "inputStage" : {
                           "stage" : "PROJECTION",
                           "transformBy" : {
                               "body" : 1,
                               "headers.Date" : 1
                           },
                           "inputStage" : {
                               "stage" : "SHARDING_FILTER",
                               "inputStage" : {
                                   "stage" : "FETCH",
                                   "inputStage" : {
                                       "stage" : "OR",
                                       "inputStages" : [
                                           {
                                               "stage" : "IXSCAN",
                                               "keyPattern" : {
                                                   "filename" : 1
                                               },
                                               "indexName" : "filename_1",
                                               "isMultiKey" : false,
                                               "multiKeyPaths" : {
                                                   "filename" : [ ]
                                               },
                                               "isUnique" : false,
                                               "isSparse" : false,
                                               "isPartial" : false,
                                               "indexVersion" : 2,
                                               "direction" : "forward",
                                               "indexBounds" : {
                                                   "filename" : [
                                                       "[\"1046\", \"1046\"]"
                                                   ]
                                               }
                                           },
                                           {
                                               "stage" : "IXSCAN",
                                               "keyPattern" : {
                                                   "headers.From" : 1
                                               },
                                               "indexName" : "headers.From_1",
                                               "isMultiKey" : false,
                                               "multiKeyPaths" : {
                                                   "headers.From" : [ ]
                                               },
                                               "isUnique" : false,
                                               "isSparse" : false,
                                               "isPartial" : false,
                                               "indexVersion" : 2,
                                               "direction" : "forward",
                                               "indexBounds" : {
                                                   "headers.From" : [
                                                       "[\"xxx@gmail.comm\", \"xxx@gmail.com\"]"
                                                   ]
                                               }
                                           }
                                       ]
                                   }
                               }
                           }
                       }
                   },
                   "rejectedPlans" : [ ]
               }

我使用的查詢命令是:

db.testmsg.find(
{
 $or: [ { "filename": "1046"}, {"headers.From":"xxx@gmail.com"}]
},{
 "body": 1, "headers.Date": 1
 }).explain();

在您的查詢中,您有,{"body": 1, "headers.Date": 1}所謂的“投影”,您可以在其中告訴查詢,您想要獲取哪些鍵(+ _id)。如果您不需要_id在結果中(您的項目_id:0)並且可以從索引中找到所有其他鍵,則可以從索引返回結果,並且數據庫引擎不需要去實際的集合來獲取_id (那是因為 _id 總是返回,除非它被投影出來;如果索引沒有 _id 作為欄位之一,則必須從磁碟讀取值)

引用自:https://dba.stackexchange.com/questions/184222