wxh:PRIMARY> db.coll.ensureIndex({id2:1} ,{unique:true})
{
"err" : "E11000 duplicate key error index: test.coll.$id2_1 dup key: { : null }",
"code" : 11000,
"n" : 0,
"lastOp" : Timestamp(1390372177, 1),
"connectionId" : 1818,
"ok" : 1
}
发现在id2上建立唯一索引建不上去,原来mongodb会把null值作为一个“真”值处理,那么就不允许一个字段上有超过2个null值存在。
这种情况下,可以通过Sparse Indexes解决这个问题
wxh:PRIMARY> db.coll.ensureIndex({id2:1} ,{unique:true ,"sparse":true})
wxh:PRIMARY> db.coll.stats()
{
"ns" : "test.coll",
"count" : 3,
"size" : 112,
"avgObjSize" : 37.333333333333336,
"storageSize" : 4096,
"numExtents" : 1,
"nindexes" : 2,
"lastExtentSize" : 4096,
"paddingFactor" : 1,
"systemFlags" : 1,
"userFlags" : 0,
"totalIndexSize" : 16352,
"indexSizes" : {
"_id_" : 8176,
"id2_1" : 8176
},
"ok" : 1
}
Sparse Indexes可能导致的问题:
> db.foo.find({"x" : {"$ne" : 2}})
{ "_id" : 0 }
{ "_id" : 1, "x" : 1 }
{ "_id" : 3, "x" : 3 }
如果你在x上建立了Sparse Indexes索引,那么查询的结果就会返回:
> db.foo.find({"x" : {"$ne" : 2}})
{ "_id" : 1, "x" : 1 }
{ "_id" : 3, "x" : 3 }
这是由于{ "_id" : 0 }并不包含在Sparse Indexes索引里,而查询的计划却走了索引扫描
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/22034023/viewspace-1074062/
,如需转载,请注明出处,否则将追究法律责任。