2012-01-10 1 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).

Благодаря аракиду, который дал правильный ответ. К сожалению, у меня недостаточно голосов для голосования.

+1

Хмм, даже если вы не можете проголосовать, вы должны иметь возможность отметить ответ как принятый, который будет отмечать вопрос как ответ. – araqnid

+0

Антон, вы должны быть в состоянии отметить это как принятое путем зависания под областью, в которой вы голосуете за ответ, и нажав галочку, которую вы видите там. – IanWhalen

ответ

7

как объекты, показывая, когда вы смотрите в новой сессии? Если сохранение небезопасно, они могут вернуться с идентификатором, указанным в коде выше, хотя сервер фактически отклонит второй.

+0

Да, вы правы! –

0

Вы должны добавить опцию { unique: true } при создании индекса

mongodb unique index documentation

+0

Я добавил эту опцию, посмотрю на код: typeUrlIndexOptions.put ("unique", true); –