Можно ли создать индекс для конкретной коллекции, используя аннотацию @Indexed или @CompoundIndex

#spring-data-mongodb

#spring-data-mongodb

Вопрос:

У меня есть объект домена, на котором есть несколько индексов. Я использовал @CompoundIndex для класса домена и @Indexed annotation для некоторых свойств класса, чтобы позволить Spring Data MongoDB автоматически создавать необходимые индексы.

Однако теперь мы хотим сохранить этот домен в другой коллекции для целей временного архивирования. Однако в этой другой коллекции нам не нужны все эти индексы. Однако Spring Data Mongo создает их.

Вот пример объекта домена:

 @CompoundIndexes({
  @CompoundIndex(...),
  @CompoundIndex(...)})
public class Unit {
  @Id
  private ObjectId id;

  @Indexed
  private ObjectId ownerId;

  ...
}
 

Есть ли какой-либо способ контролировать, какие коллекции получают индексы, кроме как не использовать аннотации spring и писать свой собственный код для создания и обеспечения индексов?

Ответ №1:

Вы можете использовать MongoTemplate при сохранении «другой» коллекции и MongoRepository для остальных.

Пример:

 @SpringBootApplication
public class AccessingDataMongodbApplication implements CommandLineRunner {

    @Autowired
    private CustomerRepository repository;

    @Autowired
    private MongoTemplate mongoTemplate;

    private static final String TEMP_COLLECTION = "customer_temp";

    public static void main(String[] args) {
        SpringApplication.run(AccessingDataMongodbApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {

        final Customer cust1 = new Customer("David", "Gilmour");
        final Customer cust2 = new Customer("Roger", "Waters");

        mongoTemplate.save(cust1, TEMP_COLLECTION);
        mongoTemplate.save(cust2, TEMP_COLLECTION);

        repository.save(cust1);
        repository.save(cust2);
    }
}

@Document
@CompoundIndexes({
        @CompoundIndex(name = "cmp_idx", def = "{'firstname' : 1, 'lastname' : 1}"),
        @CompoundIndex(name = "compound_index", def = "{'firstName':1, 'salary':-1}")
})
class Customer {

    @Id
    public String id;
    private String firstName;
    public String lastName;
    private int salary;
    @Indexed
    public String email;

    public Customer(final String firstName, final String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }
}

interface CustomerRepository extends MongoRepository<Customer, String> {

}

@Configuration
class MongoConf extends AbstractMongoClientConfiguration {

    @Override
    protected String getDatabaseName() {
        return "soq";
    }

    @Override
    public boolean autoIndexCreation() {
        return true;
    }
}
 

Проверка индексов:

 rs0:PRIMARY> use index-test-db
switched to db index-test-db
rs0:PRIMARY> show collections
customer
customer_temp
rs0:PRIMARY>
rs0:PRIMARY>
rs0:PRIMARY> db.customer.find()
{ "_id" : ObjectId("602e98d31611dc3bf65f1a56"), "firstName" : "David", "lastName" : "Gilmour", "salary" : 0, "_class" : "com.
example.accessingdatamongodb.Customer" }
{ "_id" : ObjectId("602e98d31611dc3bf65f1a57"), "firstName" : "Roger", "lastName" : "Waters", "salary" : 0, "_class" : "com.e
xample.accessingdatamongodb.Customer" }
rs0:PRIMARY> db.customer.getIndexes()
[
        {
                "v" : 2,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "index-test-db.customer"
        },
        {
                "v" : 2,
                "key" : {
                        "firstname" : 1,
                        "lastname" : 1
                },
                "name" : "cmp_idx",
                "ns" : "index-test-db.customer"
        },
        {
                "v" : 2,
                "key" : {
                        "firstName" : 1,
                        "salary" : -1
                },
                "name" : "compound_index",
                "ns" : "index-test-db.customer"
        },
        {
                "v" : 2,
                "key" : {
                        "email" : 1
                },
                "name" : "email",
                "ns" : "index-test-db.customer"
        }
]
rs0:PRIMARY>
rs0:PRIMARY>
rs0:PRIMARY>
rs0:PRIMARY> db.customer_temp.find()
{ "_id" : ObjectId("602e98d31611dc3bf65f1a56"), "firstName" : "David", "lastName" : "Gilmour", "salary" : 0, "_class" : "com.
example.accessingdatamongodb.Customer" }
{ "_id" : ObjectId("602e98d31611dc3bf65f1a57"), "firstName" : "Roger", "lastName" : "Waters", "salary" : 0, "_class" : "com.e
xample.accessingdatamongodb.Customer" }
rs0:PRIMARY> db.customer_temp.getIndexes()
[
        {
                "v" : 2,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "index-test-db.customer_temp"
        }
]