我創建了以下集合:
students> db.students.find()
[
{ _id: 1, grades: [ 95, 92, 90 ], average: 145 },
{ _id: 2, grades: [ 98, 100, 102 ], average: 145 },
{ _id: 3, grades: [ 95, 110, 100 ], average: 145 }
]
這些是可用的索引:
students> db.students.getIndexes()
[
{ v: 2, key: { _id: 1 }, name: '_id_' },
{ v: 2, key: { grades: 1 }, name: 'grades_1' },
{ v: 2, key: { average: 1 }, name: 'average_1' }
]
如果我運行這個查詢,我希望它被覆寫,因為它只需要“平均”欄位,這是一個索引欄位。
db.students.find({average:145}, {_id:0, grades:0})
相反,我使用解釋(“executionStats”)得到以下輸出:
[...]
winningPlan: {
stage: 'PROJECTION_DEFAULT',
transformBy: { _id: 0, grades: 0 },
inputStage: {
stage: 'FETCH',
inputStage: {
stage: 'IXSCAN',
keyPattern: { average: 1 },
indexName: 'average_1',
isMultiKey: false,
multiKeyPaths: { average: [] },
isUnique: false,
isSparse: false,
isPartial: false,
indexVersion: 2,
direction: 'forward',
indexBounds: { average: [ '[145, 145]' ] }
}
}
}
和這個:
totalDocsExamined: 3
這意味著查詢必須讀取集合中的檔案......我錯過了什么?謝謝
uj5u.com熱心網友回復:
您需要指定投影以僅提取索引欄位:
db.students.find({average:145}, {_id:0, average:1})
Mongodb 是無模式的,因此在 FETCH 階段之前無法知道檔案中有哪些欄位。
發生覆寫查詢的條件之一(來自https://docs.mongodb.com/manual/core/query-optimization/#covered-query)是
結果中回傳的所有欄位都在同一索引中。
該{_id:0, grades:0}法術“我希望所有的欄位,但等級”,并{_id:0, average:1}表示“我想只有平均水平”。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/377420.html
標籤:MongoDB
上一篇:如何根據mongo集合的嵌套檔案中字串日期欄位的日期范圍檢索資料
下一篇:C#獲取自定義屬性擴展方法
