2012-12-26 5 views
6

wird angenommen, dass ich solche Einheiten wie die folgende haben:Wie verwendet man Federdaten mongo @CompoundIndex mit Untersammlungen?

@Document(collection = "doc_a") 
public class A {  
    @Field("id") 
    private Integer id; 

    @Field("b") 
    private Collection<B> b; 
    ... 
} 


public class B {  
    @Field("id") 
    private Integer id; 
    ... 
} 

ist es möglich, zu verwenden, um eine compoundIndex in Bezug auf A.id UND B.id zusammen?

Ich meine vielleicht wie:

@CompoundIndex(name = "aid_bid_idx", def = "{'id', 'b.id'}") 

Vielen Dank im Voraus.

+0

haben Sie es versucht? Es funktioniert nicht? –

+0

Ich habe es noch nicht versucht, in unserer Umgebung ist es ziemlich schwer zu verstehen, ob Indizes erstellt werden und erfolgreich funktionieren oder nicht. Mongodb Verantwortung gehört unserem Architekten, und heutzutage ist er nicht verfügbar. Deshalb wollte ich zuerst von hier aus fragen. – Javatar

Antwort

9

Ich habe diese Art von Compound-Index in meiner App versucht, die auch Federdaten verwenden und ordnungsgemäß funktioniert. Sie müssen nur die Indexdefinition in @CompoundIndex Anmerkung korrigieren:

@CompoundIndex(name = "aid_bid_idx", def = "{'id' : 1, 'b.id' : 1}") 
@Document(collection = "doc_a") 
public class A {  
    @Field("id") 
    private Integer id; 

    @Field("b") 
    private Collection<B> b; 
    ... 
} 

public class B {  
    @Field("id") 
    private Integer id; 
    ... 
} 

Wenn Sie eine Abfrage mit erklären laufen (wie die folgt) in Mongo Shell, sehen Sie, dass der Index * aid_bid_idx * verwendet.

db.doc_a.find({ "id" : 1, "b.id" : 1}).explain() 

Das Ergebnis wird so etwas wie dieses:

{ 
    "cursor" : "BtreeCursor aid_bid_idx", 
    ... 
} 
+0

Thx für die Bereitstellung des Beispiels mit "explain()". – Vincent

1

ich hatte das gleiche Problem, für mich die Lösung des Miguel gearbeitet, aber ich hatte das @CompoundIndex innerhalb eines @CompoundIndexes sonst ist es didn‘wickeln t arbeiten (Ich benutze Spring Roo).

@CompoundIndexes({ 
    @CompoundIndex(name = "aid_bid_idx", def = "{'id' : 1, 'b.id' : 1}") 
}) 
@Document(collection = "doc_a") 
public class A {...} 
+0

Ich denke, CompoInIndex wird auch direkt funktionieren. Eine Sache, die in der Dokumentation fehlte, ist, dass sie nicht erwähnen, wann die Indizes erstellt werden, nachdem sie in den Codeblock eingeführt wurden. Nachdem ich eine Weile herumgespielt habe, sehe ich, dass Indizes erst erstellt werden, nachdem ein neues Dokument eingefügt wurde, das sie in den Code einführt. –

Verwandte Themen