mongodb能够索引空值吗?

时间:2015-12-21 18:14:28

标签: mongodb

我有一个帖子,其字段postStatus我想设置为true false或null。我想知道mongo是否能够索引空值。

另外,如果我选择使用null,true和false与使用-1,0,1(或任何3个int)相比有什么区别吗?

感谢

1 个答案:

答案 0 :(得分: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个字节。所以它确实有所作为,如果你有数百万的条目,相当于......好吧,几兆字节。 ;)因此,对于所有实用目的,没有区别。