2012-04-05 8 views
0

Ich habe eine objektivieren Einheit wie folgt definiert:Warum nicht nach Teilen des Entitätsschlüssels filtern?

public class MyEntity1 
{ 
    @Id @Indexed String    phoneNumber; 
    @Parent @Indexed Key<MyEntity2> parentEntityKey; 
} 

Wenn ich von phonenumber zu filtern versuchen, ich die folgende Fehlermeldung erhalten:

Cannot (yet) filter by @Id fields on entities which have @Parent fields. 

Der Grund für diese Konstruktion ist, dass ich möchte in der Lage sein, diese Datensätze zu bekommen (anstatt sie abzufragen), wenn ich sowohl phoneNumber als auch parentEntityKey kenne, was ich manchmal tue. In einigen anderen Fällen kenne ich nur die Telefonnummer und möchte sie abfragen.

Ist das ein Nachteil von Objectify oder Datastore und kann ich einen Workaround finden? Haben Sie einen Vorschlag, der meine zwei Anforderungen löst (erhalten Sie anstelle der Abfrage, wenn ich beide Werte kenne und Abfrage von phoneNumber, wenn nur das bekannt ist)?

Antwort

2

Dies ist die Art von Datenspeicherschlüsseln.

Sie können nicht nach dem ID-Teil eines Schlüssels filtern. Sie können nach einem ganzen Schlüssel filtern oder eine ancest() - Abfrage verwenden, um nach der Schlüsselhierarchie zu filtern, aber Sie können nicht nur nach dem @Id-Teil eines Schlüssels filtern. Denken Sie daran, wie die Schlüssel in BigTable angeordnet sind:

/parentkind1/parentid1/parentkind2/parentid2/kind/id 

Sie können keinen Bereichsscan nur für den ID-Teil durchführen.

Es klingt wie, was Sie tun möchten, ist eine indizierte phoneNumber Eigenschaft auf Ihrer Entität, getrennt von der @ Id-Feld. Ja, es sind doppelte Daten, aber Sie brauchen den separaten Index, egal was passiert, so dass die zusätzlichen Daten, die in den Blob serialisiert werden, ziemlich vernachlässigbar sind.

Beachten Sie, dass Sie keine indizierten Eigenschaften innerhalb einer Transaktion abfragen können, und Abfragen haben möglicherweise Konsistenzverhalten. Wenn Sie möchten, dass Telefonnummern eindeutig zugewiesen werden, müssen Sie eine separate PhoneNumber-Entität ohne @Parent erstellen, deren @Id die Telefonnummer selbst ist. Mit XG-Transaktionen können Sie diese Eindeutigkeitseinheit erstellen und sie in einer einzigen konsistenten Operation mit Ihrer MyEntity1 verknüpfen.