У меня есть часть простого кода, который должен потерпеть неудачу из-за уникального ограничения индекса. Но оба объекта добавляются в базу данных и могут запрашиваться, несмотря на уникальный индекс.
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.
Я нашел, что не так. Оба объекта получают свой собственный идентификатор после сохранения в базе данных, но фактически второй объект не сохраняется (его нельзя запросить даже по заданному идентификатору).
Благодаря araqnid, это дало правильный ответ. К сожалению, у меня недостаточно рейтинга для голосования.