MongoDB уникальный индекс не работает - PullRequest
3 голосов
/ 10 января 2012

У меня есть часть простого кода, который должен потерпеть неудачу из-за уникального ограничения индекса. Но оба объекта добавляются в базу данных и могут запрашиваться, несмотря на уникальный индекс.

    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, это дало правильный ответ. К сожалению, у меня недостаточно рейтинга для голосования.

Ответы [ 2 ]

7 голосов
/ 10 января 2012

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

0 голосов
/ 10 января 2012

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

документация по уникальному индексу mongodb

...