2011-12-22 130 views
17

我不確定我是否正確理解稀疏索引。mongo中的稀疏索引和空值

我有一個稀疏唯一索引FBID

{ 
    "ns" : "mydb.users", 
    "key" : { 
     "fbId" : 1 
    }, 
    "name" : "fbId_1", 
    "unique" : true, 
    "sparse" : true, 
    "background" : false, 
    "v" : 0 
} 

而且我期待,讓我插入記錄用null作爲FBID,而是拋出一個重複鍵異常。它只允許我插入fbId屬性被完全刪除。

是不是一個稀疏的索引應該處理?

回答

31

稀疏索引不包含缺少索引字段的文檔。但是,如果字段存在並且值爲null,它仍將被索引。因此,如果該字段的缺失及其與null的等同性對於您的應用程序而言看起來相同,並且您希望保持fbId的唯一性,那麼只有在您爲其獲取值之前不要插入它。

當您擁有大量文檔時,您需要稀疏索引,但只有一小部分文檔包含某個字段,並且您希望能夠通過該字段快速查找文檔。創建一個普通的索引會太貴,你只需要浪費寶貴的RAM來索引你不感興趣的文檔。

1

爲了確保索引的最大性能,我們可能希望省略索引那些不包含字段的文檔您正在執行索引。要做到這一點的MongoDB有稀疏的屬性,工作原理如下:

db.addresses.ensureIndex({ "secondAddress": 1 }, { sparse: true }); 

該指數將省略所有不包含secondAddress領域和執行查詢時,這些文件將永遠不會被掃描的文檔。

讓我分享這篇文章基本指標和它們的一些性質:

地理空間信息,文字,散列索引和獨特的和稀疏的屬性:http://mongodbspain.com/en/2014/02/03/mongodb-indexes-part-2-geospatial-2d-2dsphere/

1

{a:1, b:5, c:2} 
{a:8, b:15, c:7} 
{a:4, b:7} 
{a:3, b:10} 

讓我們假設我們希望創建一個索引上述文件。創建索引a & b不會是一個問題。但是如果我們需要在c上創建索引會怎麼樣。唯一約束將不適用於c密鑰,因爲空值爲2個文檔重複。這種情況下的解決方案是使用sparse選項。該選項告訴數據庫不要包含遺漏密鑰的文檔。有關的命令是db.collectionName.createIndex({thing:1}, {unique:true, sparse:true})。稀疏的索引讓我們使用更少的空間。

請注意,即使我們有sparse索引,數據庫也會執行所有文檔掃描,尤其是在進行排序時。這可以在中標計劃中看到explain的結果部分。