2015-12-21 85 views
2

我有一個帖子,其字段postStatus我想設置爲true false或null。我想知道mongo是否能夠索引空值。mongodb能夠索引空值嗎?

此外,如果我選擇null,true和false與使用-1,0,1(或任何3個整數)是否有任何區別?

感謝

空的
+0

尋找稀疏索引https://docs.mongodb.org/v3.0/core/index-sparse/ –

回答

2

索引

是,null值索引,如可以,如果你嘗試第二null值添加到唯一索引證明:

connecting to: test 
> db.idxtest.createIndex({a:1},{unique:true}) 
{ 
    "createdCollectionAutomatically" : true, 
    "numIndexesBefore" : 1, 
    "numIndexesAfter" : 2, 
    "ok" : 1 
} 
> db.idxtest.insert({a:"foo"}) 
WriteResult({ "nInserted" : 1 }) 
> db.idxtest.insert({b:"bar"}) 
WriteResult({ "nInserted" : 1 }) 
> db.idxtest.insert({c:"baz"}) 
WriteResult({ 
    "nInserted" : 0, 
    "writeError" : { 
     "code" : 11000, 
     "errmsg" : "E11000 duplicate key error index: test.idxtest.$a_1 dup key: { : null }" 
    } 
}) 

另一種方式證明空值很重要的是通過對文檔包含null值的索引字段進行排序:

> db.idxtest2.createIndex({a:1}) 
{ 
    "createdCollectionAutomatically" : true, 
    "numIndexesBefore" : 1, 
    "numIndexesAfter" : 2, 
    "ok" : 1 
} 
> db.idxtest2.insert({a:1}) 
WriteResult({ "nInserted" : 1 }) 
> db.idxtest.insert({a:2}) 
WriteResult({ "nInserted" : 1 }) 
> db.idxtest2.insert({b:2}) 
WriteResult({ "nInserted" : 1 }) 
> db.idxtest2.insert({a:null}) 
WriteResult({ "nInserted" : 1 }) 
> db.idxtest2.find().sort({a:1}) 
{ "_id" : ObjectId("56786a93ada44c7ffcd38f9f"), "b" : 2 } 
{ "_id" : ObjectId("56786aa1ada44c7ffcd38fa0"), "a" : null } 
{ "_id" : ObjectId("56786a65ada44c7ffcd38f9d"), "a" : 1 } 
> db.idxtest2.find().sort({a:-1}) 
{ "_id" : ObjectId("56786a65ada44c7ffcd38f9d"), "a" : 1 } 
{ "_id" : ObjectId("56786aa1ada44c7ffcd38fa0"), "a" : null } 
{ "_id" : ObjectId("56786a93ada44c7ffcd38f9f"), "b" : 2 } 

請注意,隱式null值有優先權;所以說,他們是「更多」null,因爲他們甚至沒有相應的關鍵。

在布爾

作爲每BSON specification,一個布爾值是單個字節,而一個整數是至少32位整數耗時4個字節。所以它確實有所作爲,如果您擁有數百萬的條目,那麼......幾兆字節。 ;)因此,所有實際目的沒有任何區別。

+0

我可以索引如果我設置,{獨特:false}(我可能有多個值設爲空) – Saad

+0

看看第二個例子。 –

+0

你確定非唯一索引存儲空值嗎? – Andy