2012-01-10 4 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가 다릅니다.

업데이트. 무엇이 잘못되었는지 발견했습니다. 두 개체는 모두 데이터베이스에 저장 한 후에 고유 한 ID를 갖지만 두 번째 개체는 실제로 저장되지 않습니다 (지정된 ID로도 쿼리 할 수 ​​없음).

araqnid 덕분에 올바른 답을 얻을 수있었습니다. 불행히도, 나는 투표 할 충분한 등급이 없습니다. 새 세션에서 볼 때 두 개체가 보이고있다 인덱스

mongodb unique index documentation

+1

흠. 투표를 할 수 없어도 대답을 승인 된 것으로 표시 할 수 있어야합니다. 그러면 대답이 답변으로 표시됩니다. – araqnid

+0

안톤, 당신은 당신이 대답에 투표하고 거기에 보이는 체크 표시를 클릭 영역 아래에 가져 가면 받아 들일 수있는 것으로 표시 할 수 있어야합니다. – IanWhalen

답변

7

를 만들 때

+0

네, 맞습니다! –

0

당신은 { unique: true } 옵션을 추가 할 필요가? 세이브가 안전하지 않은 경우 서버가 실제로 두 번째 것을 거부하더라도 위 코드에서 지정된 ID로 반환 될 수 있습니다.

+0

이 옵션을 추가했습니다. 코드를 살펴 보겠습니다. typeUrlIndexOptions.put ("unique", true); –

관련 문제