Построение индекса MongoDB в фоновом режиме как поведение по умолчанию для всех соединений - PullRequest
1 голос
/ 27 мая 2019

Нам нужно переопределить значение по умолчанию для опции background в createIndex методе MongoDB , на true, чтобы, если разработчик забудет передать параметр, он будет работать в фоновом режиме,

Есть ли способ переопределить эту опцию в драйвере, соединении или любых других уровнях?

Специально для Java .

Ответы [ 2 ]

1 голос
/ 28 мая 2019

Используя Spring Data MongoDB, вам придется переопределить метод ensureIndex для IndexOperations через DefaultIndexOperations и вернуть его для MongoOperations#indexOps(...).
Таким образом вы сможете захватить весь индекссоздание, а также аннотации на основе.

@Configuration
public class Config extends AbstractMongoConfiguration {

    @Override
    public MongoTemplate mongoTemplate() throws Exception {

        return new MongoTemplate(mongoDbFactory(), mappingMongoConverter()) {

            @Override
            public IndexOperations indexOps(Class<?> entityClass) {

                return new DefaultIndexOperations(this, getCollectionName(entityClass), entityClass) {

                    @Override
                    public String ensureIndex(IndexDefinition indexDefinition) {

                        if(indexDefinition instanceof Index) {
                            ((Index)indexDefinition).background();
                        }

                        return super.ensureIndex(indexDefinition);
                    }
                };
            }
        };
    }

    // ...
}

Для аннотаций вы также можете использовать свою собственную пользовательскую аннотацию, прикрепляющую атрибут background к фиксированному значению без возможности переопределить его, открывая изменяемые значения с помощью @AliasFor.
Что-токак в примере ниже, работает без настройки MongoOperations / IndexOperations.

@Indexed(background = true) // fix attribute values here
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.FIELD, ElementType.ANNOTATION_TYPE })
public @interface ComposedIndexedAnnotation {

    @AliasFor(annotation = Indexed.class, attribute = "unique")
    boolean unique() default false;

    @AliasFor(annotation = Indexed.class, attribute = "name")
    String indexName() default "";
}
0 голосов
/ 27 мая 2019

Вот одно решение для Spring data mongodb или mongodb-java-driver:

public static void insertIndex(MongoCollection<Document> collection) {
  //Create the json document describing your index
  Document textIndexes = new Document("dataset.metadata.description.text", "text");

  //set your index options
  IndexOptions io = new IndexOptions();
  io.name("my_index");
  io.background(true);

  //create your index for your collection
  collection.createIndex(textIndexes, io);
}

Spring data mongodb @Indexed аннотация также поставляется с различными свойствами, которые позволяют вам контролировать применение индекса. См. Ссылку

@Indexed(background= true)
...