2014-10-11 4 views
2

I и хранение объектов Doc в хранилище MongoDB гарантируя, что свойство штрих-кода является уникальным по коллекции:Springdata MongoDB автоматически генерирует и нежелательная уникальный индекс в поддокументами

@Document(collection = "Doc") 
public class Doc { 
    @Id 
    private String id; 

    @Indexed(unique = true) 
    private String barcode; 
    ... 
} 

Я также хранить коллекцию DocAudit, которая хранит списки Док, как поддокументы:

@Document(collection = "DocAudit") 
public class DocAudit {  
    @Id 
    private String id; 

    private List<Doc> docs; 
    ... 
} 

Как генерируется DocAudit запись, то же док может присутствовать в списке документов два или более записей DocAudit.

@Indexed (уникальный = истина) на свойства штрих-кода объекта Doc автоматически генерировать индексы MongoDB на Doc.barcode (по желанию) и DocAudit.docs.doc.barcode (паразитной)

Какой самый лучший способ избежать автоматической генерации нежелательного индекса? Как можно лучше удалить нежелательный индекс, как только он будет создан?

ответ

0

DocAudit, конечно, имеющего эти свойства Doc, потому что DocAudit является правопреемником.
Чтобы достичь того, чего вы хотите, вы можете рассмотреть один из следующих действий:

  • создать другой Docwithout, что аннотация, то наследуется DocAudit;
  • удалите эту аннотацию в Doc и обеспечьте индекс для Doc своими независимыми кодами (не рекомендуется);

Неплохо создавать индекс, а затем немедленно отбрасывать.

+0

Спасибо @Wizzard. Я надеялся, что в Spring-data.mongodb есть какая-то магия, которая обойдет эту проблему. Я решил проблему, выполнив абстрактный класс BaseDoc без поля штрих-кода, а затем расширив его с индексированным полем штрих-кода в фактическом классе Doc. Я также создал NestedDoc, который расширяет BaseDoc с помощью неиндексированного поля штрих-кода. DocAudit использует реализацию NestedDoc, чтобы избежать нежелательного индекса. – dgb

+0

@dgb. Технически spring-data-mongodb может выполнить ваше ожидание, добавив к аннотации ** (с индексом **) дополнительный параметр (например, ** наследуемый **). Но все же есть другие проблемы, например, один подкласс не хочет наследовать эту функцию, но хочет еще один подкласс. Другой способ может быть реализован путем создания новой аннотации, чтобы указать, наследует ли определенные функции от суперкласса или нет. Но, похоже, это осложнит разработку кода после нескольких типов иерархии наследования. Наконец, теперь ваш текущий дизайн лучше. :) – Wizard

Смежные вопросы