Sparse Indexes vs unique index

wei-xh發表於2014-01-22
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部落格 ” ,連結:http://blog.itpub.net/22034023/viewspace-1074062/,如需轉載,請註明出處,否則將追究法律責任。

相關文章