如何在其中一個欄位可能不存在或為空的 mongo 中創建復合索引?
例如在下面的檔案中,如果我創建一個復合索引名稱 年齡。在某些檔案中年齡不存在或為空的情況下,我怎樣才能實作這一目標?
{
name: "Anurag",
age: "21",
},
{
name: "Nitin",
},
uj5u.com熱心網友回復:
您可以按如下方式創建部分索引:
db.contacts.createIndex(
{ name: 1 },
{ partialFilterExpression: { age: { $exists: true } } }
)
解釋:
根據檔案,部分索引僅索引集合中滿足指定過濾器運算式的檔案。通過對集合中的檔案子集進行索引,部分索引具有較低的存盤要求并降低了索引創建和維護的性能成本。在這種特殊情況下,假設您的集合有 100k 個檔案,但只有 5 個檔案存在“年齡”欄位,在這種情況下,部分索引將僅包含索引中的這 5 個欄位,從而優化索引存盤空間并提供更好的性能。
為了讓查詢優化器選擇這個部分索引,查詢謂詞必須包括名稱欄位的條件以及年齡欄位的非空匹配。
以下示例查詢將能夠使用索引:
db.contacts.find({name:"John"})
db.contacts.find({name:"John",age:{$gt:20}})
db.contacts.find({name:"John",age:30})
以下示例查詢是基于此索引的“覆寫查詢”:
db.contacts.find({name:"John",age:30},{_id:0,name:1,age:1})
(這個查詢效率很高,因為它直接從索引回傳資料)
以下示例查詢將無法使用索引:
db.contacts.find({name:"John",age:{$exists:false}})
db.contacts.find({name:"John",age:null})
db.contacts.find({age:20})
請注意,如果您需要在 age 欄位和 name 一起搜索,您需要進行一些分析,因為 name 欄位具有非常好的選擇性,如果您僅按 age 搜索,則不會使用此索引,也許是一個不錯的選擇選項是僅在年齡欄位上創建額外的稀疏/部分索引,因此如果這是一個可能的搜索用例,您可以獲取具有特定年齡的聯系人的串列。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/433866.html
上一篇:陣列的行為不像陣列
下一篇:MongoDB大陣列或檔案
