2017-01-08 68 views
0

因此,我從[MongoDB Docs] [1]中讀取了以下索引定義。對MongoDB索引的基本誤解

索引支持在MongoDB中高效地執行查詢。沒有索引,MongoDB必須執行集合掃描,即掃描集合中的每個文檔,以選擇與查詢語句匹配的文檔。如果查詢存在適當的索引,MongoDB可以使用該索引來限制它必須檢查的文檔數量。

索引是特殊的數據結構,它以簡單的遍歷形式存儲集合數據集的一小部分。索引存儲 特定字段或字段集合的值,按字段的值 排序。索引條目的排序支持有效的 相等匹配和基於範圍的查詢操作。另外, MongoDB可以通過使用索引中的排序來返回排序結果。

我有一個樣本數據庫,其集合名爲寵物寵物具有以下結構。

{ 
    "_id": ObjectId(123abc123abc) 
    "name": "My pet's name" 
} 

我使用以下代碼創建的名稱字段的索引。

db.pets.createIndex({"name":1}) 

我想到的是,集合中的文獻,寵物,將在升序基於查詢的過程中場進行索引。此索引的結果可能潛在地減少總體查詢時間,特別是如果查詢是在考慮可用索引的戰略結構下進行的。在此假設下,以下查詢應該返回所有寵物排序按升序排序,但事實並非如此。

db.pets.find({},{"_id":0}) 

相反,它返回的寵物在他們被插入的順序。我的結論是,我對指數如何工作缺乏基本的瞭解。有人能幫我理解嗎?

+0

db.pets.find({},{ 「_ ID」:0})排序({ '名':1})。將工作。您可以使用排序()來指定的順序查詢返回匹配的文檔。查看這些鏈接瞭解更多信息https://docs.mongodb.com/manual/reference/method/cursor.sort/#cursor-sort或https://docs.mongodb.com/manual/tutorial/sort-results-with -indexes /#按照單字段索引排序 – RootHacker

回答

1

是的,這是對索引如何工作的誤解。

索引不會更改查詢的輸出,但數據庫引擎會處理查詢的方式。因此,db.pets.find({},{"_id":0})將始終以自然順序返回文檔,而不管是否存在索引。

只有在您的查詢中使用索引時纔會使用索引。因此, db.pets.find({name : "My pet's name"},{"_id":0})db.pets.find({}, {_id : 0}).sort({name : 1})將使用{name : 1}索引。

您應該在您的查詢上運行explain以檢查是否正在使用索引。

您可能想要參考有關索引如何工作的文檔。 https://docs.mongodb.com/manual/indexes/
https://docs.mongodb.com/manual/tutorial/sort-results-with-indexes/

+0

很好的答案,謝謝。 – Sp333th