MongoDB 高階索引
MongoDB 高階索引
考慮以下文件集合(users ):
{ "address": { "city": "Los Angeles", "state": "California", "pincode": "123" }, "tags": [ "music", "cricket", "blogs" ], "name": "Tom Benzamin" }
以上文件包含了 address 子文件和 tags 陣列。
索引陣列欄位
假設我們基於標籤來檢索使用者,為此我們需要對集合中的陣列 tags 建立索引。
在陣列中建立索引,需要對陣列中的每個欄位依次建立索引。所以在我們為陣列 tags 建立索引時,會為 music、cricket、blogs三個值建立單獨的索引。
使用以下命令建立陣列索引:
>db.users.ensureIndex({"tags":1})
建立索引後,我們可以這樣檢索集合的 tags 欄位:
>db.users.find({tags:"cricket"})
為了驗證我們使用使用了索引,可以使用 explain 命令:
>db.users.find({tags:"cricket"}).explain()
以上命令執行結果中會顯示 "cursor" : "BtreeCursor tags_1" ,則表示已經使用了索引。
索引子文件欄位
假設我們需要通過city、state、pincode欄位來檢索文件,由於這些欄位是子文件的欄位,所以我們需要對子文件建立索引。
為子文件的三個欄位建立索引,命令如下:
>db.users.ensureIndex({"address.city":1,"address.state":1,"address.pincode":1})
一旦建立索引,我們可以使用子文件的欄位來檢索資料:
>db.users.find({"address.city":"Los Angeles"})
查詢表達不一定遵循指定的索引的順序,mongodb 會自動優化。所以上面建立的索引將支援以下查詢:
>db.users.find({"address.state":"California","address.city":"Los Angeles"})
同樣支援以下查詢:
>db.users.find({"address.city":"Los Angeles","address.state":"California","address.pincode":"123"})