2013-04-04 38 views
10

Tôi đang sử dụng spring-data-mongodb-1.2.0.RELEASE. Tôi có hai lớp A và B trong đó B có tham chiếu đến A và được chú thích bằng @DBRef.Dữ liệu mùa xuân - Chỉ mục MongoDB DBRef

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

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

Vì tôi quering cho tất cả các trường hợp của B được đề cập đến một Một chắc chắn:

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

tôi cần nó để được lập chỉ mục.

Sau lần chèn B đầu tiên vào MongoDB, chỉ mục sẽ được tạo. Như có thể thấy bên dưới, không:

Có ai biết làm cách nào để tạo chỉ mục như vậy không?

Ngoài ra có vẻ như tệp DBRef (có thể được xem bởi vỏ mongo) không khớp với định dạng như được định nghĩa tại MongoDB documentation.

Tôi có thiếu gì đó ở đây không?

Trả lời

9

Bạn có thể tạo các bảng xếp hạng với vỏ Mongo, nhưng nếu bạn muốn làm điều đó thông qua mã và kể từ khi bạn đang sử dụng lò xo dữ liệu MongoDB, sử dụng này:

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

bạn cũng có thể xác định n ame của bộ sưu tập nếu tên của lớp học của bạn không phù hợp với nó:

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

Tôi nghĩ rằng điều này sẽ làm việc: @CompoundIndex(name = "b_ref_to_a", def = "{'a.id' : 1}") @Document(collection = "b") public class B {...}

Nếu không, bạn có thể gọi mongoTemplate.indexOps("b").ensureIndex(...) trong một phương pháp chú thích với @PostConstruct hoặc lâu hơn

+1

Cảm ơn sự giúp đỡ. Tuy nhiên, tại sao chỉ mục không được tạo ra, nó được chú thích bằng @Indexed? và một câu hỏi mở khác là tại sao tài liệu MongoDB hiển thị DBRef ở định dạng khác với định dạng có thể nhìn thấy ở ảnh chụp màn hình Mongo – Modi

+0

Đối với @Indexed, nó không thực sự được ghi lại, nhưng tôi không nghĩ nó phù hợp cho phức tạp các loại, dù sao cũng không bao giờ làm việc cho tôi. Cá nhân, tôi sử dụng một trong hai phương pháp được đề cập ở trên để lập chỉ mục "phức tạp" loại. Đối với vấn đề thứ hai, bạn đang sử dụng phiên bản vỏ mongodb nào? thử 'db.d.find ({}, {" a. $ ref ": 1," a. $ id ": 1})' bạn nhận được gì? –

+0

Tôi đang sử dụng Mongo DB và phiên bản shell 2.4.1. Tôi có thể thực hiện các truy vấn tiếp theo: db.b.find ({"a. $ Id": }, {"a. $ Id": 1}) và db.b.find ({"a. $ id ": }, {" a. $ ref ": 1}) nhưng Tôi không thể bao gồm. $ ref và a. $ id trên đối số dự đoán và đối số điều kiện phải bao gồm" a. $ id ". Quan trọng nhất là để sử dụng chỉ mục đã được tạo trên 'a', phần tử truy vấn phải bao gồm a. $ Id và a. $ Ref: db.b.tìm ({a: {"$ ref": a, "$ id": }}) – Modi

3

tôi đã cùng một vấn đề, đối với tôi giải pháp của orid làm việc nhưng tôi đã phải quấn @CompoundIndex bên trong một @CompoundIndexes nếu không nó didn 't làm việc (Tôi đang sử dụng Spring Roo).

@CompoundIndexes({ 
    @CompoundIndex(name = "b_ref_to_a", def = "{'a.id' : 1}") 
}) 
@Document(collection = "b") 
public class B {...} 
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(); 
Các vấn đề liên quan