Spring Данные - индексирование MongoDB DBRef

Я использую spring -data-mongodb-1.2.0.RELEASE. У меня есть два класса A и B, где B имеет ссылку на A и аннотируется с помощью @DBRef.

Класс A:

@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;
}
}

Класс B:

@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.

Я что-то пропустил?

Ответ 1

Вы можете создать индекс с помощью оболочки 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));

Ответ 2

Я думаю, что это сработает: @CompoundIndex(name = "b_ref_to_a", def = "{'a.id' : 1}") @Document(collection = "b") public class B {...}

Если нет, вы можете вызвать mongoTemplate.indexOps("b").ensureIndex(...) в методе, аннотированном с помощью @PostConstruct или так

Ответ 3

У меня была та же проблема, для меня было создано решение orid, но мне пришлось обернуть @CompoundIndex внутри @CompoundIndexes, иначе это не сработало (я использую Spring Roo).

@CompoundIndexes({
    @CompoundIndex(name = "b_ref_to_a", def = "{'a.id' : 1}")
})
@Document(collection = "b")
public class B {...}

Ответ 4

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();