10

我正在使用 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 文档中定义的格式不匹配。

我在这里错过了什么吗?

4

4 回答 4

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));
于 2013-04-04T20:22:16.167 回答
5

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

如果没有,您可以调用mongoTemplate.indexOps("b").ensureIndex(...)带有@PostConstruct或注释的方法

于 2013-04-04T18:36:39.367 回答
3

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

@CompoundIndexes({
    @CompoundIndex(name = "b_ref_to_a", def = "{'a.id' : 1}")
})
@Document(collection = "b")
public class B {...}
于 2014-09-28T16:13:07.420 回答
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();
于 2016-06-02T09:28:37.817 回答