天天看點

第五章 MongoDb索引優化 5.4

5、唯一索引

先看看之前建立的,rsc索引:

index ---------

{ "name" : "rsc_1" , "ns" : "ms_basic.schedule" , "key" : { "rsc" : 1}}

在rsc字段上,建立唯一索引:

coll.dropIndex(new BasicDBObject("rsc", 1));

coll.ensureIndex(new BasicDBObject("rsc", 1).append("unique", true));

顯示結果:

{ "name" : "rsc_1_unique_" , "ns" : "ms_basic.schedule" , "key" : { "rsc" : 1 , "unique" : true}}

存在如下rsc=的資料:

{ "_id" : { "$oid" : "4c2fe764dd969674cb31a0be"} , "liveStatus" : 0 , "startDate" : "2010-11-12" , "isList" : 0 , "location" : "CAG" , "posttime" : "2010-04-01 15:04:57.0" , "rsc" : "WRM160513" , "noliveTvName" : "" , "endDate" : "2010-11-12" , "endTime" : "09:30" , "isGold" : 0 , "version" : 0 , "startTime" : "09:30" , "disciplineName" : "摔跤" , "event" : "160" , "gender" : "M" , "isMedal" : 0 , "discipline" : "WR" , "venueId" : "CAG" , "phaseName" : "資格賽" , "isRecommend" : 0 , "isData" : 0 , "eventUnitType" : "HATH" , "chatroomStatus" : 0 , "isChina" : 0 , "isStartTime" : 0 , "competitionStatus" : 0 , "unit" : "13" , "tvName" : "男子古典式 - 60公斤級資格賽" , "flag" : 0 , "scheduleName" : "資格賽" , "isEndTime" : 0 , "rid" : "" , "eventName" : "男子古典式 - 60公斤級" , "phase" : "5" , "isResult" : 0}

往表data中插入一條記錄。

System.out.println("-----------華麗分隔線---------------");   

    Schedule schedule = new Schedule();

    schedule.setRsc("WRM160513");

    schedule.setScheduleName("重複值");

    BasicDBObject val = new BasicDBObject();

    val.put("rsc","WRM160513");

    val.put("scheuleName","kaokao");

coll.insert(val);

沒有報錯,查詢結果:

注意:java應用中,有個問題,如果資料已經重複了,那麼使用:

是沒有錯誤提示的,此時繼續執行插入操作,是成功的。

{ "_id" : { "$oid" : "4c3334ea76c7eebe35fb1f81"} , "rsc" : "WRM160513" , "scheduleName" : "kaokao"}

java中,生成索引結果:

> db.schedule.getIndexes();

[

        {

                "name" : "_id_",

                "ns" : "ms_basic.schedule",

                "key" : {

                        "_id" : 1

                }

        },

                "name" : "rsc_1_unique_",

                        "rsc" : 1,

                        "unique" : true

        }

]

指令行結果:

> db.schedule.ensureIndex({rsc:1},{unique: true});

                "_id" : ObjectId("4c3335de22090000000065d5"),

                        "rsc" : 1

                },

                "name" : "rsc_1",

                "unique" : true

後來檢查發現:

應該使用:coll.ensureIndex(new BasicDBObject("rsc", 1),"rsc",true);

而不是:coll.ensureIndex(new BasicDBObject("rsc", 1).append("unique", true));

這種方式相當于建立了組合索引:rsc_unique,是錯誤的

認真看看API文檔說明即可發現。

本文轉自jooben 51CTO部落格,原文連結:http://blog.51cto.com/jooben/365912