Spring Data - MongoDB индексирует DBRef
Я использую spring-data-mongodb-1.2.0.RELEASE. У меня есть два класса A и B, где B имеет ссылку на A, и это аннотируется @DBRef.
Класс А:
@Document(collection = "a")
public class A {
@Id
public String id;
/** The TicketGrantingTicket this is associated with. */
@Field
public String name;
public A(String id, String name) {
this.id = id;
this.name = name;
}
}
Класс Б:
@Document(collection = "b")
public class B {
@Id
public String id;
@Field
public String name;
@DBRef
@Indexed
public A a;
public B(String id, String name, A a) {
super();
this.id = id;
this.name = name;
this.a = a;
}
}
Поскольку я запрашиваю все экземпляры B, ссылающиеся на определенный A:
B fromDB = mongoOperations.findOne(Query.query(Criteria.where("a.$id").is(a1.id)), B.class);
Мне нужно, чтобы это было проиндексировано.
После первой вставки экземпляра B в MongoDB должен быть создан индекс. Как видно ниже, это не так:
Кто-нибудь знает, как я могу создать такой индекс?
Кроме того, похоже, что поле DBRef (как видно из оболочки mongo) не соответствует формату, как это определено в документации MongoDB.
Я что-то здесь упускаю?
4 ответа
Вы можете создать индекс с помощью оболочки mongo, но если вы хотите сделать это с помощью кода и поскольку вы используете spring-data-mongodb, используйте это:
mongoTemplate.indexOps(B.class).ensureIndex(new Index().on("a", Order.ASCENDING));
Вы также можете указать имя коллекции, если имя вашего класса не соответствует ему:
mongoTemplate.indexOps("b").ensureIndex(new Index().on("a", Order.ASCENDING));
Я думаю, что это будет работать:@CompoundIndex(name = "b_ref_to_a", def = "{'a.id' : 1}")
@Document(collection = "b")
public class B {...}
Если нет, вы можете позвонить mongoTemplate.indexOps("b").ensureIndex(...)
в методе, аннотированном с @PostConstruct
или так
У меня была та же проблема, для меня решение orid сработало, но мне пришлось обернуть @CompoundIndex внутри @CompoundIndexes, иначе это не сработало (я использую Spring Roo).
@CompoundIndexes({
@CompoundIndex(name = "b_ref_to_a", def = "{'a.id' : 1}")
})
@Document(collection = "b")
public class B {...}
DBObject indexOptions = new BasicDBObject();
indexOptions.put("a", 1);
indexOptions.put("b", 1);
indexOptions.put("c.d", 1);
indexOptions.put("e.f", 1);
CompoundIndexDefinition indexDefinition =
new CompoundIndexDefinition(indexOptions);
mongoTemplate.indexOps(.class).ensureIndex(indexDefinition);
for unique index you can add mongoTemplate.indexOps(.class).ensureIndex(indexDefinition).unique();