Spring Data - MongoDB索引DBRef

时间:2013-04-04 18:11:57

标签: mongodb indexing spring-data-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;
}
}

因为我正在查询引用某个A的所有B实例:

B fromDB = mongoOperations.findOne(Query.query(Criteria.where("a.$id").is(a1.id)), B.class);

我需要将其编入索引。

首次将B实例插入MongoDB后,应创建一个索引。 从下面可以看出它没有:

有谁知道如何创建这样的索引?

此外,它看起来像DBRef字段(可以通过mongo shell看到)与格式不匹配,因为它定义在 MongoDB documentation

我在这里错过了什么吗?

4 个答案:

答案 0 :(得分:9)

您可以使用mongo shell创建索引,但是如果您想通过代码执行此操作,并且因为您使用的是spring-data-mongodb,请使用:

mongoTemplate.indexOps(B.class).ensureIndex(new Index().on("a", Order.ASCENDING));

如果您的班级名称与该名称不匹配,您也可以指定该名称:

mongoTemplate.indexOps("b").ensureIndex(new Index().on("a", Order.ASCENDING));

答案 1 :(得分:5)

我认为这会奏效: @CompoundIndex(name = "b_ref_to_a", def = "{'a.id' : 1}") @Document(collection = "b") public class B {...}

如果没有,您可以在使用mongoTemplate.indexOps("b").ensureIndex(...)左右注释的方法中调用@PostConstruct

答案 2 :(得分:3)

我遇到了同样的问题,对于我来说,orid的解决方案有效,但我必须将@CompoundIndex包装在@CompoundIndex中,否则它不起作用(我使用的是Spring Roo)。

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

答案 3 :(得分:1)

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