2012-01-10 145 views
3

我有一部分簡單代碼,由於唯一的索引約束而必須失敗。但是這兩個對象都被添加到數據庫中,並且可以被查詢,儘管索引是唯一的。MongoDB唯一索引不起作用

BasicDBObject typeUrlIndex = new BasicDBObject(); 
    typeUrlIndex.put(FIELD_TYPE_URL, 1); 

    BasicDBObject typeUrlIndexOptions = new BasicDBObject(); 
    typeUrlIndexOptions.put("background", true); 
    typeUrlIndexOptions.put("sparse", true); 
    typeUrlIndexOptions.put("unique", true); 
    typeUrlIndexOptions.put("dropDups", true); 

    objects.ensureIndex(typeUrlIndex, typeUrlIndexOptions); 

    // here I can check, that index is really created, and it is true. 
    List<DBObject> indexes = objects.getIndexInfo(); 

    BasicDBObject dbo1 = new BasicDBObject(FIELD_TYPE_URL, "aaa"); 
    objects.save(dbo1); 

    BasicDBObject dbo2 = new BasicDBObject(FIELD_TYPE_URL, "aaa"); 
    objects.save(dbo2); 

兩個對象都保存並獲得不同的_id。

Upd。 我發現,什麼是錯的。兩個對象在保存到數據庫後都會獲得自己的ID,但實際上第二個對象不會被保存(即使通過給定的ID也不能查詢)。

感謝araqnid,這給了正確的答案。不幸的是,我沒有足夠的評分來投票。

+1

嗯,即使你不能投票,你應該能夠將答案標記爲已接受,這將標記問題爲已回答。 – araqnid 2012-01-10 18:20:26

+0

安東,您應該能夠將此標記標記爲懸停在您對答案進行投票的區域下方,然後單擊您在此處看到的複選標記。 – IanWhalen 2012-01-16 19:54:21

回答

7

當兩個物體顯示出來,當你在一個新的會話看?如果保存是不安全的,即使服務器實際上會拒絕第二個,他們也可能會返回上面代碼中分配的ID。

+0

是的,你是對的! – 2012-01-10 17:54:55

0

您需要添加{ unique: true }選項創建索引

mongodb unique index documentation

+0

我已經添加了這個選項,看看代碼:typeUrlIndexOptions.put(「unique」,true); – 2012-01-10 16:33:03