2013-04-04 13 views
10

Używam danych sprężynowych-mongodb-1.2.0.RELEASE. Mam dwie klasy A i B, gdzie B ma odniesienie do A i jest opatrzone adnotacją @DBRef.Dane sprężyny - indeksowanie MongoDB DBRef

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

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

Odkąd jestem quering dla wszystkich wystąpień B, które są nawiązujące do pewnego A:

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

I trzeba go zindeksować.

Po pierwszym wstawieniu instancji B do MongoDB powinien zostać utworzony indeks. Jak widać poniżej, nie ma:

Czy ktoś wie, jak mogę utworzyć taki indeks?

Dodatkowo wygląda na to, że DBRef (jak widać w powłoce mongo) nie pasuje do formatu zdefiniowanego w MongoDB documentation.

Czy tu czegoś brakuje?

Odpowiedz

9

Można utworzyć indeks z powłoki Mongo, ale jeśli chcesz zrobić za pośrednictwem kodu a ponieważ używasz wiosna-data-MongoDB, użyj tego:

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

można również określić n ame kolekcji jeśli nazwa klasy nie pasuje go:

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

myślę, że to będzie działać: @CompoundIndex(name = "b_ref_to_a", def = "{'a.id' : 1}") @Document(collection = "b") public class B {...}

Jeśli nie, możesz zadzwonić mongoTemplate.indexOps("b").ensureIndex(...) w metodzie z dopiskiem @PostConstruct lub tak

+1

Dziękuję za pomoc. Dlaczego indeks nie jest tworzony, mimo że ma adnotację @Indexed? i innym otwartym pytaniem jest dlaczego dokumentacja MongoDB pokazuje DBRef w innym formacie niż ten, który można zobaczyć na migawce powłoki Mongo – Modi

+0

Co do @Indexed, to nie jest naprawdę udokumentowane, ale nie sądzę, że jest odpowiedni dla złożonego typy nigdy nie pracowały dla mnie. Osobiście używam jednej z dwóch wyżej wymienionych metod do indeksowania typu "złożonego". Co do drugiego wydania, jakiej wersji powłoki Mongodb używasz? spróbuj 'db.d.find ({}, {" a. $ ref ": 1," a. $ id ": 1})" co otrzymujesz? –

+0

Używam Mongo DB i wersji powłoki 2.4.1. Mogę wykonać kolejne zapytania: db.b.find ({"a. $ Id": }, {"a. $ Id": 1}) i db.b.find ({"a. $ id ": }, {" a. $ ref ": 1}), ale Nie mogę dołączyć a. $ ref i a. $ id do argumentu projekcji, a argument warunku musi zawierać" a. $ id ". Najważniejsze jest to, że aby użyć indeksu utworzonego na "a", element zapytania musi zawierać identyfikator a. $ Id a. $ Ref: db.b.find ({a: {"$ ref": a, "$ id": }}) – Modi

3

miałem ten sam problem, jak dla mnie rozwiązanie tego ORID pracował ale musiałem owinąć @CompoundIndex wewnątrz ciągu @CompoundIndexes inaczej nie zrobił Działa (używam 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(); 
Powiązane problemy