#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"
}
]